【问题标题】:Node-cron: Wait for job finished to execute the next onenode-cron:等待作业完成执行下一个
【发布时间】:2020-01-04 23:14:01
【问题描述】:

我正在使用包"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。

任何建议我做错了什么?

【问题讨论】:

    标签: javascript cron node-cron


    【解决方案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();
    

    【讨论】:

    • 您能否编辑您的答案并更详细地解释您的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多