动态更新nodejs cronjob周期

Dynamically update nodejs cronjob period

我需要在我的 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 个 CronJobs,它们都将 运行。为了 "change" 期间,您必须先停止第一个 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);

如果您想动态更改时间,可以使用cron 作业的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)