Отложенная задача в Nest
Некоторые шаги не должны стартовать сразу после ответа клиенту: письмо или напоминание логичнее запустить через короткую паузу, не держа метод страницы занятым.
BullMQ принимает настройки
задачи третьим аргументом
при постановке. Поле
delay задаёт паузу
в миллисекундах до того,
как запись станет доступна
обработчику.
Покажем на примере постов:
import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bullmq';
import { Queue } from 'bullmq';
@Injectable()
export class PostService {
postQueue: Queue;
constructor(@InjectQueue('posts') postQueue: Queue) {
this.postQueue = postQueue;
}
async scheduleReminder(title: string) {
await this.postQueue.add(
'post-reminder',
{ title },
{ delay: 5000 },
);
}
}
Обработчик срабатывает только после паузы и фиксирует заголовок:
import { Processor, WorkerHost } from '@nestjs/bullmq';
import { Job } from 'bullmq';
@Processor('posts')
export class PostProcessor extends WorkerHost {
remindedTitle = '';
async process(job: Job<{ title: string }>) {
if (job.name === 'post-reminder') {
this.remindedTitle = job.data.title;
}
}
}
Поставьте из WorkerService
задачу с паузой, а
WorkerProcessor после
срабатывания запишет данные
в поле класса.