动态更新nodejs cronjob周期

kam*_*esh 5 cron scheduled-tasks node.js 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");
Run Code Online (Sandbox Code Playgroud)

Jer*_*NER 6

在这里,您将创建 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);
Run Code Online (Sandbox Code Playgroud)


Dan*_*ara 6

如果你想动态改变时间,可以使用CronTimecron job 的方法,然后调用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)
Run Code Online (Sandbox Code Playgroud)