【发布时间】:2011-08-03 21:51:08
【问题描述】:
是否可以在 node.js 中的特定时间定期调用函数?我的第一个实现是
setInterval(functionName(),(24*60*60*1000));
这是次优的,因为每次我重新启动节点时它都会重新启动。是否有更好的可能性来实现这一点?
【问题讨论】:
标签: javascript node.js cron
是否可以在 node.js 中的特定时间定期调用函数?我的第一个实现是
setInterval(functionName(),(24*60*60*1000));
这是次优的,因为每次我重新启动节点时它都会重新启动。是否有更好的可能性来实现这一点?
【问题讨论】:
标签: javascript node.js cron
这是一个老问题,但除了公认的答案之外,还值得一提的是带有示例的库。
cron 是一个轻量级的包,它以给定的时间间隔运行指定的函数,只使用系统时间,没有数据库持久性。
const CronJob = require('cron').CronJob;
const jobFiveMinutes = require("./job.five-minutes");
const jobMondayMorning = require("./job.monday-morning");
var jobs = [
new CronJob({
cronTime: "00 */5 * * * *", //every five minutes
onTick: function() {
jobFiveMinutes();
},
start: false, //don't start immediately
timeZone: 'America/Los_Angeles'
}),
new CronJob({
cronTime: "00 00 9 * * 1", //9 am Monday morning
onTick: function() {
jobMondayMorning();
},
start: false,
timeZone: 'America/Los_Angeles'
}),
];
jobs.forEach(function(job) {
job.start(); //start the jobs
});
在上面,我们需要两个文件并在两个 cronjobs 中调用它们,设置不同的时间间隔。这些文件只是导出函数:
//job.five-minutes.js
module.exports = function(){
console.log("runs every five minutes")
};
//job.monday-morning.js
module.exports = function(){
console.log("runs every monday morning at 9 am, Los Angeles time")
};
无论您是在本地运行还是在任何区域的远程服务器上运行,它都会根据传递的时区运行(虽然这是可选的,在分钟的情况下无关紧要)。
此外,重新启动服务器/脚本不会影响其工作,因为它与系统时间同步。 "00 */5 * * * *" 作业将在 5 的每个倍数上运行,即 5、10、15、20 等等。因此,即使您在 24 点重新启动脚本,它也会在 25 点而不是 29 点运行。
最后,该软件包扩展了 cron 语法以在最左侧包含秒数。因此,您甚至可以知道您想要运行该作业的确切时间。
【讨论】:
为了防止重新启动,您需要创建一个持久的数据存储作业。
类似:
Job = {
_id: Number,
job: String,
dueDate: Date,
completed: Boolean
}
然后有一些代码如下:
var createJob = function(url, date) {
var j = db.create(Job, function(j) {
j.job = url;
j.dueDate = date;
j.save();
});
};
var runJob = function(j) {
var id = j._id;
setInterval(j.dueDate - Date.now(), function() {
db.getOne(Job, { _id : id }, function(j) {
require(j.job);
j.finished = true;
j.save();
});
});
j = null;
};
在启动时,您只需执行以下操作:
db.get(Job, { finished: false }, function(jobs) {
jobs.forEach(runJob);
});
用 MongoDB、CouchDB、Redis 等替换通用的 db。
【讨论】: