我需要一个Nodejs调度程序,允许不同间隔的任务

时间:2013-12-10 16:02:02

标签: node.js cron scheduled-tasks

我正在寻找节点作业计划,这将允许我以不同的间隔安排许多任务。例如,

  • 每隔30秒调用一次功能
  • 每60秒呼叫一次功能
  • 每7天致电一次功能

我也希望能够启动和停止这个过程。

到目前为止,我已经看过了:

  • later - 语法让我感到困惑,显然你也无法安排超过一个月的任务

  • agenda - 似乎最有希望,但我对数据库功能感到困惑

  • timeplan - 太简单了,无法启动和停止

我发现后者的语法令人困惑。

6 个答案:

答案 0 :(得分:203)

我会推荐node-cron。它允许使用Cron模式运行任务,例如

'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)

但也有更多复杂的计划,例如

'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.

示例代码:每10分钟运行一次作业:

var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function(){
    // perform operation e.g. GET request http.get() etc.
    console.info('cron job completed');
}); 
cronJob.start();

您可以在node-cron wiki

中找到更多示例

有关cron配置的更多信息,请访问cron wiki

我一直在很多项目中使用该库,它完成了这项工作。我希望这会有所帮助。

答案 1 :(得分:35)

我使用了node-cronagenda

node-cron 是一个非常简单的库,它提供了非常基本且易于理解的api,如crontab。它不需要任何配置,只是工作。

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

议程非常强大,适合更复杂的服务。想想ifttt,你必须运行数百万个任务。 议程将是最佳选择。

注意:您需要 Mongodb 才能使用议程

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

答案 2 :(得分:10)

我编写了一个节点模块,它使用提供声明性接口的时刻持续时间来提供setInterval的包装:

  

npm随时安装

var every = require('every-moment');

var timer = every(5, 'seconds', function() {
    console.log(this.duration);
});

every(2, 'weeks', function() {
    console.log(this.duration);
    timer.stop();
    this.set(1, 'week');
    this.start();
});

https://www.npmjs.com/package/every-moment

https://github.com/raygerrard/every-moment

答案 3 :(得分:10)

我认为最好的排名是

  

1.node时间表

     

2.later

     

3.crontab

以及node-schedule的样本如下:

var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function(){
    console.log("execute jj");
});

也许你可以从node modules找到答案。

答案 4 :(得分:6)

nodeJS默认

https://nodejs.org/api/timers.html

setInterval(function() {
    // your function
}, 5000);

答案 5 :(得分:0)

我写了一个小模块来做到这一点。你可以在这里找到它:
https://github.com/paragi/timexe.git
https://www.npmjs.com/package/timexe

部分功能:

  • 其简单,小巧可靠的代码,没有依赖性
  • 分辨率以毫秒为单位,随着时间的推移具有高精度
  • Cron喜欢但不兼容(逆序和其他改进)
  • 我也在浏览器中工作

安装:

npm install timexe

使用:

var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”)});

//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”)});

//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”)});

//Every Wednesdays 
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”)});

// Stop "every 30 sec. timer"
timexe.remove(res1.id);

您可以通过直接在timexe作业数组中删除/重新添加条目来实现启动/停止功能。但它不是一个明确的功能。