簡體   English   中英

在 Typescript 中實現公牛隊列

[英]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();
    }
}

快速問題:這個實現是否足以讓我的工作排隊工作?,如果不是:我必須做什么?

我最近寫了一篇似乎與您的用例有關的博客文章:

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

一些提示:

  • 在你的模塊中,一定要導入你的BullModule (來自@nestjs/bull )。 例如,您需要配置您的隊列名稱(在您的情況下為“郵件”)並設置您的隊列。 一個常見的設置包括使用 redis 主機名和端口進行配置。
  • 在您的服務中,您需要將作業以及可選的有效負載添加到隊列中。 在您的情況下,您正在嘗試添加 function。 相反,您應該添加一個作業名稱,例如“confirmationEmail”,並傳遞一個有效負載,例如usertoken 我的示例如下所示: await this.mailQueue.add('confirmationEmail', { user, token })
  • 您需要為您的隊列實現一個處理器 這是一個 class 裝飾有來自@nestjs/bull@Processor(QUEUE_NAME)裝飾器(在你的例子中是@Processor('mail') )。 處理器處理添加到隊列中的作業。
  • 在您的處理器中,您可以實現一個方法,例如sendConfirmationEmail()來處理名為“confirmationEmail”的作業。 您可以使用@Process(JOB_NAME)來裝飾該方法,例如@Process('confirmationEmail') 該方法可以接收您的有效負載。 根據我的示例,以下方法簽名將提供usertokenasync sendConfirmationEmail(job: Job<{ user: User, token: string }>): Promise<any> (注意Job來自bull package,而你不妨輸入您的回報與使用any )。 這是您實際發送 email 的地方。
  • 在您的處理器 class 中, @nestjs/bull還提供了特殊的方法裝飾器,包括@OnQueueActive()@OnQueueCompleted()@OnQueueFailed() 請參閱文檔,但您可能會發現這些對日志記錄或其他目的很有用。

這個想法是,當應用程序處於空閑狀態時,您的處理器會處理隊列中的作業。

您的郵件模塊可能至少有一個帶有配置的mail.module.ts ,一個將作業添加到“郵件”隊列的mail.service.ts ,以及一個mail.processor.ts完成添加到“郵件”隊列。

NestJS 的更多文檔可在以下位置獲得:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM