NestJS 单独的队列

问题描述

根据文档 NestJS Docs 有两种实现队列的方法。 使用 redis 和命名或未命名队列,例如像这里:Queue Redis Example 或这里 Queue Redis Example 2 和在带有处理器的单独进程中运行的队列。

我最近尝试实现此处找到的第二种方式 Queues in separate processes,但我的处理器未被识别,结果为:

Error message

有人可以帮助我并提供一个最小的工作示例吗?

我看到已经有一个最近打开的问题:Queues Processes Docs Issue 但是如果有人可以帮助我或提供的线程中的这个人,我可以制作 PR 或官方维护者可以这样做。>

提前致谢! 最好的问候 Ragitagha

解决方法

NestJS Bull 包是对 Bull 的很好的包装,它为在单独进程中运行的作业提供支持。

要利用 Bulls 自动分叉处理,您只需提供可充当作业处理器的文件的路径。

创建要用于运行作业的单独文件

import { Logger } from '@nestjs/common';
import { DoneCallback,Job } from 'bull';

export default function (job: Job<{ message: string }>,cb: DoneCallback) {
  Logger.verbose(`${job.data.message} (pid ${process.pid})`,`SEPARATE`);
  cb(null,'Hurrah');
}

请记住,此文件需要能够自行运行。当然,您可以添加其他导入等,但它将在不同的进程中运行,因此您的应用程序及其资源将无法使用。

注册队列时,指定单独文件的路径。在这里,我注册了 2 个队列。一个在与应用程序相同的进程中运行,一个将在单独的进程中运行

@Module({
  imports: [
    // register root
    BullModule.forRoot({
      redis: {
        host: 'localhost',port: 6379,},}),// register queues
    BullModule.registerQueue(
      {
        name: 'SAME',// this will run in same process as this module
      },{
        name: 'SEPARATE',// this will run in its own process
        processors: [join(__dirname,'separate.process')],),],controllers: [AppController],providers: [SameService],})
export class AppModule {}

然后您可以照常解雇工作。下面我将一个作业发送到应用程序进程的队列中,然后将另一个作业发送到单独的文件中

@Controller()
export class AppController {
  constructor(
    @InjectQueue('SAME') private readonly same: Queue,@InjectQueue('SEPARATE') private readonly separate: Queue,) {}

  @Get()
  getHello(): string {

    // Example of adding a job processed in same thread
    this.same.add({ message: 'Knock knock.' });

    // Example of adding a job processed in separate thread
    this.separate.add({ message: 'FORK OFF.' });

    return 'ok';
  }
}

localhost:3000 然后输出

[Nest] 13400   - 08/05/2021,16:49:18   [SAME] Knock knock. (pid 13400) +8821ms
[Nest] 2660   - 08/05/2021,16:49:19   [SEPARATE] FORK OFF. (pid 2660)

Here is a link to the repo

希望这会有所帮助!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...