javascript - 在 Typescript 中实现 Bull Queue

标签 javascript typescript queue message-queue job-scheduling

我尝试在 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();
    }
}
快速问题:这个实现是否足以让我的工作排队工作?
如果没有:我必须做什么?

最佳答案

我最近写了一篇似乎与您的用例有关的博客文章:
https://firxworx.com/blog/coding/nodejs/email-module-for-nestjs-with-bull-queue-and-the-nest-mailer/
一些提示:

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

  • 这个想法是,当应用程序处于空闲状态时,您的处理器会处理队列中的作业。
    您的邮件模块可能至少有一个 mail.module.ts带配置,mail.service.ts将作业添加到“邮件”队列,以及 mail.processor.ts它负责完成添加到“邮件”队列中的任何作业。
    NestJS 的更多文档可在以下位置获得:
    https://docs.nestjs.com/techniques/queues

    关于javascript - 在 Typescript 中实现 Bull Queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62894243/

    相关文章:

    deployment - 在 ejb-jar.xml 中添加队列 JNDI 引用?在 EJB/MDB 中发送 JMS 消息

    c - FIFO 队列头指针不正确

    javascript - React 中的列表查询

    javascript - rails 5.2 Webpacker Assets 管道

    visual-studio - 在 Visual Studio 2015 ASP.NET Core 项目中保存时,Angular 2 .ts 文件未转换为 .js

    javascript - 使用 JavaScript/Typescript 从服务器下载文件

    python - 在 Python 中保存队列数据

    javascript - 带参数的 Vuex 映射 setter/getter - 缓存?

    javascript - 如何让 javascript 处理 php 加载的内容?

    typescript - 如何解决WebStorm中的 "Corresponding file not included in tsconfig.json"错误?