node.js中的Cronjobs

时间:2011-04-12 13:34:56

标签: javascript node.js cron

是否有可能在node.js中的某一特定时间定期调用函数?我的第一个实现是

setInterval(functionName(),(24*60*60*1000));

这不是最理想的,因为每次重新启动节点时它都会重新启动。是否有更好的可能性来实现这一目标?

2 个答案:

答案 0 :(得分:21)

为了防止重启,您需要创建一个持久数据存储作业。

类似的东西:

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

答案 1 :(得分:0)

这是一个老问题,但除了接受的答案外,还有一个带例子的图书馆值得一提。

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语法扩展为包含最左侧的秒数。因此,您甚至可以确定您想要运行作业的第二分钟。