Повтор задачи в Nest
Внешний шаг иногда падает из-за сети или временной недоступности сервиса. Один сбой не должен навсегда убирать задачу, если повтор может пройти через секунду.
При постановке указывают
attempts: сколько раз
BullMQ попробует выполнить
задачу. Если метод
process бросает ошибку,
задача возвращается в очередь
до исчерпания попыток.
Покажем на примере постов:
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 enqueueFragile(title: string) {
await this.postQueue.add(
'post-fragile',
{ title },
{ attempts: 3 },
);
}
}
Обработчик намеренно падает, пока счётчик попыток не дойдёт до трёх, и тогда завершает работу:
import { Processor, WorkerHost } from '@nestjs/bullmq';
import { Job } from 'bullmq';
@Processor('posts')
export class PostProcessor extends WorkerHost {
successAfterRetries = false;
async process(job: Job<{ title: string }>) {
if (job.attemptsMade < 2) {
throw new Error('temporary failure');
}
this.successAfterRetries = true;
}
}
Поставьте из WorkerService
задачу с повторами.
WorkerProcessor сначала
сообщает об ошибке, а затем
отмечает успех в поле класса.