我正在使用软件包"cron": "^1.7.1"
。
我想完成一项可能比计划的cron-job花费更长时间的任务。
在我的最小可行示例下面查找:
const CronJob = require('cron').CronJob;
console.log('Before job instantiation');
const job3 = new CronJob(
'*/2 * * * * *', async () => {
if (job3.taskRunning) {
return
}
try {
//run longer task here
await setTimeout(() => {
const d = new Date();
console.log('JOB 3 - ', d);
job3.taskRunning = true
}, 6000);
} catch (err) {
console.log(err);
}
job3.taskRunning = false
}
)
console.log('After job instantiation');
job3.start();
您可以看到我的作业运行every 2 seconds
并打印:
JOB 3 - 2019-09-01T17:06:22.006Z
JOB 3 - 2019-09-01T17:06:24.001Z
JOB 3 - 2019-09-01T17:06:26.002Z
JOB 3 - 2019-09-01T17:06:28.001Z
但是,由于任务需要运行every 6 seconds
,因此我只想得到6 seconds
消息。
有人建议我在做什么错吗?
答案 0 :(得分:1)
正确初始化运行标识符可以解决该问题。创建全局变量taskRunning初始化为说未运行。然后,在调用长时间运行的任务之前,使其处于运行状态。在长时间运行的任务再次完成之前,请将其设置为不运行。添加了额外的控制台日志,以防长时间运行的任务完成并返回而不执行该任务时发生下一次触发时间。
const CronJob = require('cron').CronJob;
taskRunning=false
console.log('Before job instantiation');
const job3 = new CronJob(
'*/2 * * * * *', async () => {
if (taskRunning) {
console.log('returning')
return
}
taskRunning=true
try {
//run longer task here
await setTimeout(() => {
const d = new Date();
console.log('JOB 3 - ', d);
taskRunning = false
}, 6000);
} catch (err) {
console.log(err);
}
}
)
console.log('After job instantiation');
job3.start();