如何检测Node.js中schedule定时任务的最后一次执行时机?
检测定时任务最后一次执行的实现方案
你可以通过以下两种稳定可用的方式实现需求,不需要额外引入第三方依赖:
方案1:执行时判断下一次调度是否存在
node-schedule 实例的nextInvocation()方法会返回下一次任务的执行时间,当没有下一次执行(即当前触发已经是最后一次)时,该方法会返回null,你可以在任务回调中增加判断逻辑,示例代码如下:
const job = schedule.scheduleJob( { start: scheduledJob.startTime, end: scheduledJob.endTime, rule: cronExp, }, async () => { this.jobService.send(scheduledJob); console.log("sent notification"); // 判断是否为最后一次执行 const nextRun = job.nextInvocation(); if (!nextRun || nextRun.getTime() > scheduledJob.endTime.getTime()) { // 这里执行数据库删除逻辑 await this.jobService.delete(scheduledJob.id); // 可选:手动销毁job实例释放资源 job.cancel(); } } );
方案2:监听任务的终止事件
node-schedule 的任务实例在到达设置的end时间自动终止时,会触发canceled事件,你可以直接监听该事件执行删除逻辑,不需要在执行回调里加判断:
const job = schedule.scheduleJob( { start: scheduledJob.startTime, end: scheduledJob.endTime, rule: cronExp, }, () => { this.jobService.send(scheduledJob); console.log("sent notification"); } ); // 监听任务终止事件 job.addListener('canceled', async () => { // 这里执行数据库删除逻辑 await this.jobService.delete(scheduledJob.id); });
补充说明
- 如果你的cron规则最后一次执行时间早于你设置的
end时间,两种方案都可以正常触发删除逻辑 - 若任务执行过程中出现异常导致进程退出,会触发不了删除逻辑,你可以额外加定时扫表的兜底逻辑,处理超时未删除的历史任务
内容的提问来源于stack exchange,提问作者Sameh Hassoun
相关产品推荐
相关产品推荐

