РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpShOf 111 of 201 menu
◀ ▶

Отключение задачи в 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 через реестр планировщика.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить