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