简体   繁体   English

如何动态注册队列以嵌套js牛队列

[英]How to dynamically register queues to nest js bull queue

When you know the list of queues to be registered, you can add them using registerQueue() in nestjs module instantiation but how to dynamically register a queue, for eg.当您知道要注册的队列列表时,您可以在 nestjs 模块实例化中使用 registerQueue() 添加它们,但如何动态注册队列,例如。 if I have a multi tenant architecture, when a new tenant is created I want to register a new queue dynamically, is it possible to do with nest js bull queue?如果我有一个多租户架构,当创建一个新租户时我想动态注册一个新队列,是否可以使用嵌套 js 公牛队列?

I don't know if you can do that with the Nest package.我不知道您是否可以使用 Nest package 做到这一点。 Check this GitHub issue response from the Nestjs's creator.检查来自 Nestjs 创建者GitHub 问题响应。

You can, however, use the vanilla Bull package.但是,您可以使用原版 Bull package。

For example, imagine that you have a Controller like this:例如,假设您有这样的 Controller:

@Controller()
export class AppController {
  constructor(
    private queuesManager: QueuesManagerService
  ) {}

  @Post(['generate-queue'])
  generateQueue(
    @Body() generateQueueDto: GenerateQueueDto
  ): Promise<GenerateQueueResponse> {
    return this.queuesManager.generateQueue(generateQueueDto.name);
  }

  @Get(['get-all-jobs'])
  getAllJobsFromQueue(
    @Query() queryParameters: GetAllJobsEndpointQueryParameters
  ): Promise<Bull.Job[]> {
    return this.queuesManager.getAllJobsFromQueue(queryParameters.name);
  }
}

And the QueuesManagerService looks like this: QueuesManagerService看起来像这样:

@Injectable()
export class QueuesManagerService {
  async generateQueue(name: string): Promise<GenerateQueueResponse> {
    const queue: Bull.Queue = new Bull(name);
    await queue.add({ test: 'test' });
    return {
      status: 200,
      message: `Queue with name ${name} generated successfully!`,
    };
  }

  async getAllJobsFromQueue(name: string): Promise<Bull.Job[]> {
    const jobStatuses: Bull.JobStatus[] = [
      'waiting',
      'delayed',
      'active',
      'completed',
      'failed',
    ];
    const queue: Bull.Queue = new Bull(name);
    const jobs: Bull.Job[] = await queue.getJobs(jobStatuses);
    return jobs;
  }
}

You could interact with the server using curl :您可以使用curl与服务器交互:

$ curl -X POST -d 'name=myFirstQueue' localhost:3333/api/generate-queue

# response
{"status":200,"message":"Queue with name myFirstQueue generated successfully!"}

###

$ curl localhost:3333/api/get-all-jobs?name=myFirstQueue

# response
[{"id":"1","name":"__default__","data":{"test":"test"},"opts":{"attempts":1,"delay":0,"timestamp":1639085434398},"progress":0,"delay":0,"timestamp":1639085434398,"attemptsMade":0,"stacktrace":[],"returnvalue":null,"finishedOn":null,"processedOn":null}]

PS1 : PS1

Bull's Github公牛Github

queue.getJobs() reference queue.getJobs() 参考

PS2 : PS2

My Classes and Interfaces:我的类和接口:

export class GetAllJobsEndpointQueryParameters {
  @IsNotEmpty()
  name!: string;
}

export class GenerateQueueDto {
  @IsNotEmpty()
  name!: string;
}

export interface GenerateQueueResponse {
  status: number;
  message: string;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM