在 Typescript 中实现 Bull Queue

Implementing Bull Queue in Typescript

我尝试在 Typescript 和 NestJS 中实现 Bull 队列, 我的代码:

@Injectable()
export class MailService {
    constructor(
        @InjectQueue('mail')
        private readonly mailQueue: Queue
    ) {}

    async addToQueue(): Promise<void> {
        this.mailQueue.add(() => {
            return this.sendMail(); 
        })
    }
    
    
    async sendMail(): Promise<void> {

        //logic to implement

        this.addToQueue();
    }
}

快速问题:这个实现是否足以让我的作业排队工作? 如果不是:我必须做什么?

我最近写了一篇博客 post,似乎与您的用例有关:

https://firxworx.com/blog/coding/nodejs/email-module-for-nestjs-with-bull-queue-and-the-nest-mailer/

几点提示:

  • 在您的模块中,确保导入您的 BullModule(来自 @nestjs/bull)。例如,您需要配置您的队列名称(在您的情况下为“邮件”)并设置您的队列。常见的设置包括使用 redis 主机名和端口进行配置。
  • 在您的服务中,您需要将 jobs 添加到队列,以及可选的 payload。在您的情况下,您正在尝试添加一个功能。相反,您应该添加一个作业名称,例如“confirmationEmail”,并传递有效负载,例如 usertoken。我的示例如下所示:await this.mailQueue.add('confirmationEmail', { user, token })
  • 您需要为队列实施 处理器。这是一个用 @nestjs/bull 中的 @Processor(QUEUE_NAME) 装饰器装饰的 class(在你的例子中是 @Processor('mail'))。处理器处理添加到队列中的作业。
  • 在你的处理器中,你可以实现一个方法,例如sendConfirmationEmail() 处理名为“confirmationEmail”的作业。您可以用 @Process(JOB_NAME) 修饰该方法,例如@Process('confirmationEmail')。该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供 usertokenasync sendConfirmationEmail(job: Job<{ user: User, token: string }>): Promise<any>(注意 Job 来自 bull 包,您可能希望输入 return 与使用 any)。这里是您实际发送电子邮件的地方。
  • 在您的处理器中 class,@nestjs/bull 还提供了特殊的方法装饰器,包括 @OnQueueActive()@OnQueueCompleted()@OnQueueFailed()。请参阅文档,但您可能会发现这些对于日志记录或其他目的很有用。

想法是当应用程序空闲时,您的处理器处理队列中的作业。

您的邮件模块可能至少有一个 mail.module.ts 配置,一个 mail.service.ts 将作业添加到“邮件”队列,以及一个 mail.processor.ts 负责完成添加到“邮件”队列的任何作业。

有关 NestJS 的更多文档,请访问:

https://docs.nestjs.com/techniques/queues