在 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”,并传递有效负载,例如
user
和 token
。我的示例如下所示:await this.mailQueue.add('confirmationEmail', { user, token })
- 您需要为队列实施 处理器。这是一个用
@nestjs/bull
中的 @Processor(QUEUE_NAME)
装饰器装饰的 class(在你的例子中是 @Processor('mail')
)。处理器处理添加到队列中的作业。
- 在你的处理器中,你可以实现一个方法,例如
sendConfirmationEmail()
处理名为“confirmationEmail”的作业。您可以用 @Process(JOB_NAME)
修饰该方法,例如@Process('confirmationEmail')
。该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供 user
和 token
:async 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 的更多文档,请访问:
我尝试在 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”,并传递有效负载,例如
user
和token
。我的示例如下所示:await this.mailQueue.add('confirmationEmail', { user, token })
- 您需要为队列实施 处理器。这是一个用
@nestjs/bull
中的@Processor(QUEUE_NAME)
装饰器装饰的 class(在你的例子中是@Processor('mail')
)。处理器处理添加到队列中的作业。 - 在你的处理器中,你可以实现一个方法,例如
sendConfirmationEmail()
处理名为“confirmationEmail”的作业。您可以用@Process(JOB_NAME)
修饰该方法,例如@Process('confirmationEmail')
。该方法可以接收您的有效负载。根据我的示例,以下方法签名将提供user
和token
:async 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 的更多文档,请访问: