动态更新nodejs cronjob周期

Posted

技术标签:

【中文标题】动态更新nodejs cronjob周期【英文标题】:Dynamically update nodejs cronjob period 【发布时间】: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");

【问题讨论】:

【参考方案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 我已经使评论更具描述性,现在看看

以上是关于动态更新nodejs cronjob周期的主要内容,如果未能解决你的问题,请参考以下文章

动态路由概述

GLSL中的动态VBO读/写?

使用 featuretools / DFS 更新数据

常见动态路由实践———RIP协议篇

动态路由协议之RIP

JSON 服务器 - 使用 cronjob 更新数据库