Отключение задачи в Nest
Фоновый шаг иногда нужно приостановить по сигналу из API: обслуживание, ручная сверка или пауза на время демонстрации. Перезапуск всего процесса ради одной задачи груб и не всегда доступен на сервере.
Nest хранит зарегистрированные
cron-задачи в SchedulerRegistry.
Его внедряют в контроллер
или сервис, по имени из
настроек @Cron получают
CronJob и вызывают у
него остановку. Так задача
перестаёт срабатывать, пока
её снова не запустят.
Покажем на примере постов:
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
@Injectable()
export class PostTasksService {
@Cron(CronExpression.EVERY_MINUTE, {
name: 'post-list-minute',
})
handleCron() {
console.log('Post list minute');
}
}
В контроллере добавим адрес, который останавливает задачу по имени:
import { Controller, Post } from '@nestjs/common';
import { SchedulerRegistry } from '@nestjs/schedule';
@Controller('posts')
export class PostController {
schedulerRegistry: SchedulerRegistry;
constructor(schedulerRegistry: SchedulerRegistry) {
this.schedulerRegistry = schedulerRegistry;
}
@Post('tasks/stop')
stopPostTask(): string {
const job = this.schedulerRegistry.getCronJob(
'post-list-minute',
);
job.stop();
return 'Post task stopped';
}
}
Контроллер, провайдер задач и модуль планировщика собирают в корневом модуле:
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { PostController } from './post.controller.js';
import { PostTasksService } from './post.tasks.service.js';
@Module({
imports: [ScheduleModule.forRoot()],
controllers: [PostController],
providers: [PostTasksService],
})
export class AppModule {}
Сделайте адрес в
WorkerController,
который останавливает
именованную минутную задачу
из WorkerTasksService
через реестр планировщика.