@ditsmod/schedule
Цей модуль забезпечує підтримку планування завдань (cron-задач, інтервалів та таймаутів) у застосунках Ditsmod.
Встановлення
yarn add @ditsmod/schedule
Підключення ScheduleModule
Для активації п ланування імпортуйте ScheduleModule у ваш кореневий або фіче-модуль, а також зареєструйте клас із завданнями в providersPerMod (або providersPerApp):
import { rootModule } from '@ditsmod/core';
import { ScheduleModule } from '@ditsmod/schedule';
import { MyTasks } from './my-tasks.service.js';
@rootModule({
imports: [ScheduleModule],
providersPerMod: [MyTasks],
})
export class AppModule {}
Використання декораторів
Створіть сервіс та декоруйте його методи за допомогою @cron, @interval або @timeout:
import { injectable, Logger } from '@ditsmod/core';
import { cron, interval, timeout, CronExpression } from '@ditsmod/schedule';
@injectable()
export class MyTasks {
constructor(private logger: Logger) {}
@cron(CronExpression.EVERY_5_SECONDS, { name: 'my-cron-job' })
handleCron() {
this.logger.log('info', 'Cron job ticked!');
}
@interval('my-interval-job', 3000)
handleInterval() {
this.logger.log('info', 'Interval ticked!');
}
@timeout('my-timeout-job', 2000)
handleTimeout() {
this.logger.log('info', 'Timeout triggered!');
}
}
Декоратор @cron
Дозволяє запускати методи за розкладом cron. Він приймає:
- Перший аргумент: стандартний cron-вираз (наприклад,
* * * * * *для виконання щосекунди) або об'єктDate. - Другий аргумент (опціонально): об'єкт параметрів
CronOptions:name: унікальне ім'я для можливості отримання посилання черезSchedulerRegistry.timeZone: часовий пояс для виконання завдання.utcOffset: зміщення часового поясу в хвилинах.disabled: якщо встановлено вtrue, завдання не буде автоматично запущено при старті застосунку.initialDelay: затримка в мілісекундах перед першим запуском після старту застосунку.
Декоратори @interval та @timeout
@interval(timeoutMs)або@interval(name, timeoutMs)— періодичне виконання кожніtimeoutMsмілісекунд.@timeout(timeoutMs)або@timeout(name, timeoutMs)— одноразове виконання після затримки уtimeoutMsмілісекунд.
Динамічне керування завданнями
Ви можете впровадити SchedulerRegistry у свої сервіси або контролери для динамічного пошуку, запуску, зупинки чи видалення зареєстрованих завдань:
import { controller, route } from '@ditsmod/rest';
import { SchedulerRegistry } from '@ditsmod/schedule';
@controller()
export class ScheduleController {
constructor(private registry: SchedulerRegistry) {}
@route('GET', 'tasks')
listTasks() {
return {
intervals: this.registry.getIntervals(),
timeouts: this.registry.getTimeouts(),
cronJobs: Array.from(this.registry.getCronJobs().keys()),
};
}
@route('POST', 'tasks/stop-interval/:name')
stopInterval(name: string) {
if (this.registry.doesExist('interval', name)) {
this.registry.deleteInterval(name);
return { message: `Interval task "${name}" stopped.` };
}
return { message: `Interval task "${name}" not found.` };
}
}