2023-01-29 13:44:19 +08:00
|
|
|
import cron from 'node-cron';
|
|
|
|
|
export type CronTask = {
|
|
|
|
|
/**
|
|
|
|
|
* 为空则为单次执行
|
|
|
|
|
*/
|
|
|
|
|
cron: string;
|
|
|
|
|
job: () => Promise<void>;
|
|
|
|
|
name: string;
|
|
|
|
|
};
|
|
|
|
|
export class Cron {
|
|
|
|
|
logger;
|
2024-07-21 02:32:03 +08:00
|
|
|
immediateTriggerOnce: boolean;
|
2023-01-29 13:44:19 +08:00
|
|
|
constructor(opts) {
|
|
|
|
|
this.logger = opts.logger;
|
2024-07-21 02:32:03 +08:00
|
|
|
this.immediateTriggerOnce = opts.immediateTriggerOnce;
|
2023-01-29 13:44:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
register(task: CronTask) {
|
|
|
|
|
if (!task.cron) {
|
|
|
|
|
this.logger.info(`[cron] register once : [${task.name}]`);
|
|
|
|
|
task.job();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.logger.info(`[cron] register cron : [${task.name}] ,${task.cron}`);
|
|
|
|
|
cron.schedule(task.cron, task.job, {
|
|
|
|
|
name: task.name,
|
|
|
|
|
});
|
2023-05-24 15:41:35 +08:00
|
|
|
this.logger.info('当前定时任务数量:', this.getListSize());
|
2023-01-29 13:44:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
remove(taskName: string) {
|
|
|
|
|
this.logger.info(`[cron] remove : [${taskName}]`);
|
|
|
|
|
const tasks = cron.getTasks() as Map<any, any>;
|
2023-05-24 15:41:35 +08:00
|
|
|
const node = tasks.get(taskName);
|
|
|
|
|
if (node) {
|
|
|
|
|
node.stop();
|
|
|
|
|
tasks.delete(taskName);
|
|
|
|
|
}
|
2023-01-29 13:44:19 +08:00
|
|
|
}
|
|
|
|
|
|
2023-05-24 15:41:35 +08:00
|
|
|
getListSize() {
|
2023-01-29 13:44:19 +08:00
|
|
|
const tasks = cron.getTasks();
|
|
|
|
|
return tasks.size;
|
|
|
|
|
}
|
|
|
|
|
}
|