开发者

Cronjobs in node.js

开发者 https://www.devze.com 2023-02-25 12:52 出处:网络
Is there a possibility to periodically call functions at a specific time of the day in node.js? My first implementation was

Is there a possibility to periodically call functions at a specific time of the day in node.js? My first implementation was

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

This is suboptimal, because it will restart every 开发者_开发知识库time I restart node. Are there better possibilities to implement this?


To guard against restarts you need to create a persistent data stored job.

Something like :

Job = {
    _id: Number,
    job: String,
    dueDate: Date,
    completed: Boolean
}

Then have some code as follows:

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;
};

On start up you just have to do something like :

db.get(Job, { finished: false }, function(jobs) {
    jobs.forEach(runJob);
});

Replace the generic db with MongoDB, CouchDB, Redis, etc.


It's an old question, but in addition to the accepted answer a library with examples is worth mentioning.

cron is a lightweight package which runs the specified function at given interval, using only system's time and no db persistence.

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
});

Above, we required two files and call them inside of two cronjobs, set at different intervals. The files simply export the functions:

//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")
};

Whether you run it locally or on remote server in any region, it will run according to the passed timezone (which is optional though, and does not matter in case of minutes).

Also, restarting the server/script will have no affect on its working as it's synced with system time. A "00 */5 * * * *" job will run on each multiple of 5 i.e. 5, 10, 15, 20 and so on. So, even if you restart the script at 24, it will run at 25 not 29.

Lastly, the package has extended the cron syntax to include seconds on the left most. Therefore, you can even tell at what exact second of the minute you want to run the job.

0

精彩评论

暂无评论...
验证码 换一张
取 消