Реализация Bull Queue в Typescript - PullRequest
3 голосов
/ 14 июля 2020

Я пытаюсь реализовать очередь Bull в Typescript и Nest JS, мой код:

@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();
    }
}

быстрый вопрос: Достаточно ли этой реализации для работы моей очереди заданий? Если нет: что я должен делать?

1 Ответ

1 голос
/ 16 июля 2020

Недавно я написал сообщение в блоге, которое, кажется, относится к вашему варианту использования:

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

Несколько советов:

  • Обязательно импортируйте в свой модуль BullModule (из @nestjs/bull). Например, вам нужно настроить имя очереди (в вашем случае «почта») и настроить свою очередь. Обычная настройка включает настройку с использованием имени хоста и порта redis.
  • В вашем сервисе вам нужно добавить заданий в очередь вместе с необязательной полезной нагрузкой . В вашем случае вы пытаетесь добавить функцию. Вместо этого вы должны добавить имя задания, например, «confirmEmail», и передать полезные данные, например user и token. Мой пример будет выглядеть так: await this.mailQueue.add('confirmationEmail', { user, token })
  • Вам необходимо реализовать процессор для вашей очереди. Это класс, украшенный декоратором @Processor(QUEUE_NAME) из @nestjs/bull (@Processor('mail') в вашем случае). Процессор обрабатывает задания, которые добавляются в очередь.
  • В вашем процессоре вы можете реализовать метод, например, sendConfirmationEmail(), который обрабатывает задание с именем «confirmEmail». Вы бы украсили этот метод @Process(JOB_NAME), например @Process('confirmationEmail'). Метод может получать ваши полезные данные. В моем примере следующая сигнатура метода предоставит user и token: async sendConfirmationEmail(job: Job<{ user: User, token: string }>): Promise<any> (примечание Job из пакета bull, и что вы можете sh ввести свой результат вместо использования any). Вот куда вы на самом деле отправили бы электронное письмо.
  • В вашем классе процессора @nestjs/bull также предоставляет специальные декораторы методов, включая @OnQueueActive(), @OnQueueCompleted(), @OnQueueFailed(). Обратитесь к документации, но вы можете найти их полезными для ведения журнала или других целей. почтовый модуль предположительно будет иметь как минимум mail.module.ts с конфигурацией, mail.service.ts, который добавляет задания в «почтовую» очередь, и mail.processor.ts, который заботится о завершении любых заданий, добавленных в «почтовую» очередь.

    Дополнительная документация от Nest JS доступна по адресу:

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

...