动态更新nodejs cronjob期间

时间:2015-11-30 07:06:36

标签: node.js cron scheduled-tasks cron-task

我需要在我的nodejs应用程序中定期执行一些任务。如果它是固定的时期,那么它工作正常。但就我而言,这段时间应该动态变化。下面是我的代码,它没有像我预期的那样工作。这里cronjob没有更新它改变期间的时期。

var period = 1;
var CronJob = require('cron').CronJob;
new CronJob('*/' + period + ' * * * * *', function () {
    console.log("some task");
}, null, true, "Indian/Mauritius");


new CronJob('*/5 * * * * *', function () {
    period = period * 2;
    console.log("updating cronjob period");
}, null, true, "Indian/Mauritius");

2 个答案:

答案 0 :(得分:2)

在这里,您将创建两个同时运行的CronJobs。为了“改变”这个时期,你必须首先停止第一个Cronjob,然后创建一个新的Cronjob。

例如(未经测试的代码)

var job;
var period = 1;
var CronJob = require('cron').CronJob;
function createCron(job, newPeriod) {
  if (job) {
    job.stop();
  }
  job = new CronJob('*/' + newPeriod + ' * * * * *', function () {
            console.log("some task");
        }, null, true, "Indian/Mauritius");
}
createCron(job, 1);
setTimeout(function() {
  period = period * 2;
  createCron(job, period);
}, 60000);

答案 1 :(得分:2)

如果你想动态更改时间,可以通过要求cron job的CronTime方法然后调用函数a.setTime(new CronTime(newCronTime))来实现。 在下面的例子中,我创建了一个cron作为常量' a'每4秒运行一次,然后我改变了时间,使其每秒运行一次。 函数a.start()和a.stop()用于启动和停止调度程序。

     const CronJob = require('cron').CronJob
     const CronTime = require('cron').CronTime

     const a = new CronJob('*/4 * * * * *', function () {
       run() // function called inside cron
     }, null, false)

     let run = () => {
       console.log('function called')
     }

     let scheduler = () => {
       console.log('CRON JOB STARTED WILL RUN IN EVERY 4 SECOND')
       a.start()
     }

     let schedulerStop = () => {
       a.stop()
       console.log('scheduler stopped')
     }

     let schedulerStatus = () => {
       console.log('cron status ---->>>', a.running)
     }

     let changeTime = (input) => {
       a.setTime(new CronTime(input))
       console.log('changed to every 1 second')
     }

     scheduler()
     setTimeout(() => { schedulerStatus() }, 1000)
     setTimeout(() => { schedulerStop() }, 9000)
     setTimeout(() => { schedulerStatus() }, 10000)
     setTimeout(() => { changeTime('* * * * * *') }, 11000)
     setTimeout(() => { scheduler() }, 12000)
     setTimeout(() => { schedulerStop() }, 16000)