我尝试在 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 主机名和端口进行配置。 user
和 token
.我的示例如下所示:await this.mailQueue.add('confirmationEmail', { user, token })
@Processor(QUEUE_NAME)
装饰的类来自 @nestjs/bull
的装饰师( @Processor('mail')
在你的情况下)。处理器处理添加到队列中的作业。 sendConfirmationEmail()
处理名为“confirmationEmail”的作业。你可以用 @Process(JOB_NAME)
来装饰这个方法。 ,例如@Process('confirmationEmail')
.该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供 user
和 token
: 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/