在 Typescript 中实现 Bull Queue

Posted

技术标签:

【中文标题】在 Typescript 中实现 Bull Queue【英文标题】:Implementing Bull Queue in Typescript 【发布时间】:2020-11-03 17:37:27 【问题描述】:

我尝试在 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();
    

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

【问题讨论】:

你创建了一个mail.processor吗? 是///////////// 【参考方案1】:

我最近写了一篇似乎与您的用例相关的博文:

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) 装饰器装饰的类(在你的情况下是@Processor('mail'))。处理器处理添加到队列中的作业。 在您的处理器中,您可以实现一个方法,例如sendConfirmationEmail() 处理名为“confirmationEmail”的作业。您可以使用@Process(JOB_NAME) 来装饰该方法,例如@Process('confirmationEmail')。该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供usertokenasync sendConfirmationEmail(job: Job&lt; user: User, token: string &gt;): Promise&lt;any&gt;(注意Job 来自bull 包,您可能希望输入您的回报与使用any )。这是您实际发送电子邮件的地方。 在您的处理器类中,@nestjs/bull 还提供了特殊的方法装饰器,包括 @OnQueueActive()@OnQueueCompleted()@OnQueueFailed()。请参阅文档,但您可能会发现这些对日志记录或其他用途很有用。

这个想法是,当应用处于空闲状态时,您的处理器会处理队列中的作业。

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

更多来自 NestJS 的文档,请访问:

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

【讨论】:

太棒了!谢谢伙计!还有一个问题,我如何处理 e.q. 中的逻辑。 @OnQueueActive 而不是记录? 嘿,我很高兴它有帮助。用@OnQueueActive() 装饰的方法将作为参数传递给作业(例如方法签名:onQueueActive(job: Job))。因此,在该方法中,您可以访问job.idjob.namejob.data 并且可以从那里开始。不过,我认为您不一定需要在其中添加逻辑,因为在大多数情况下您可以编写一个 @Process() 装饰方法来更好地分解您的代码。 为了完善我的评论,@OnQueueCompleted() 装饰方法接收 jobresult 作为参数,@OnQueueFailed() 装饰方法接收 joberror 作为参数。 我有最后一个问题,你能举一个 Jest 中牛队测试的例子吗? 那里的文章很棒且透彻。

以上是关于在 Typescript 中实现 Bull Queue的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 1.8 中实现一个简单的字典

在 Python 中实现 Typescript 接口

在 Typescript 中实现接口时如何定义私有属性?

TypeScript 在类中实现接口

如何让一个类在 Typescript 中实现调用签名?

如何在 vue 组件中实现 typescript 代码?