首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类型记录中实现Bull队列

在类型记录中实现Bull队列
EN

Stack Overflow用户
提问于 2020-07-14 11:34:46
回答 1查看 7K关注 0票数 4

我尝试在类型记录和NestJS中实现Bull队列,我的代码:

代码语言:javascript
复制
@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();
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-15 23:40:38

我最近写了一篇似乎与用例有关的博客文章:

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

以下是一些小窍门:

  • 在您的模块中,请确保导入BullModule (从@nestjs/bull)。例如,您需要配置您的队列名(在您的情况下是“mail”)并设置您的队列。常见的设置包括使用redis主机名和端口进行配置。
  • 在您的服务中,您需要向队列中添加作业以及可选的有效负载。在您的例子中,您正在尝试添加一个函数。相反,您应该添加一个作业名,例如"confirmationEmail",并传递一个有效负载,例如usertoken。我的示例如下所示:await this.mailQueue.add('confirmationEmail', { user, token })
  • You需要为队列实现一个处理器。这是一个用@Processor(QUEUE_NAME)装饰器装饰的类,它来自@nestjs/bull (在您的例子中是@Processor('mail'))。处理器处理添加到队列中的作业。
  • 在您的处理器中,您可以实现一个方法,例如,处理名为"confirmationEmail“的作业的sendConfirmationEmail()。你可以用@Process(JOB_NAME)来装饰那个方法,例如@Process('confirmationEmail')。该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供usertokenasync 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62894243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档