【问题标题】:Dynamically update nodejs cronjob period动态更新nodejs cronjob周期
【发布时间】:2016-03-03 18:22:51
【问题描述】:

我需要在我的 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");

【问题讨论】:

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


    【解决方案1】:

    在这里,您正在创建 2 个将同时运行的 CronJobs。为了“改变”周期,你必须先停止第一个 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);
    

    【讨论】:

      【解决方案2】:

      如果你想动态改变时间,你可以通过使用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)
      

      【讨论】:

      • 不只是“你也可以试试这个”,您能否指出您的样本与问题有何关联?
      • 嗨@rudolf_franek 我已经使评论更具描述性,现在看看
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多