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


127

我正在寻找一个节点作业计划,该计划将允许我以不同的时间间隔计划许多任务。例如,

  • 每30秒调用一次函数A
  • 每60秒调用一次功能B
  • 每7天调用一次函数C

我还希望能够启动和停止该过程。

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

  • 稍后 -语法使我感到困惑,显然您也不能安排一个月以上的任务

  • 议程 -似乎是最有前途的,但是我对数据库功能感到困惑

  • 时间计划 -太简单了,无法启动和停止

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


1
仅使用setInterval听起来像您想要的那样怎么样?
adeneo

是的,为什么不使用setInterval?
2013年

我知道其中一些使用setInterval,但是我正在寻找更高层次的东西…… 我曾经在python中使用schedule(github.com/dbader/schedule),并且我正在寻找一个节点类似的
user379468 2013年


我使用了议程,还不错
Aleksandr Golovatyi

Answers:


223

我会推荐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

我已经在许多项目中使用该库,并且可以完成工作。我希望这会有所帮助。


好的,我对cron语法感到恐惧,但这似乎是最好的方法
user379468 2013年

1
等一下,我很快就会跟我说话,我该如何编写一个每5秒或30秒运行一次的cron?
user379468 2013年

3
cron语法可能看起来很吓人。另一方面,它存在时间很长,并且众所周知,因此将获得SO的大量支持
Tom

1
刚刚更新了我的回复,因此将是-'* / 5 * * * * *'-每5秒或'* / 30 * * * * *'秒
Tom

1
截至2020年,根据node-cron官方npm页的介绍,此软件包的使用率有所下降。该软件包的最新发布时间是2年前的npm,因此没有定期更新。现在,最好使用另一个名称明显相同但使用不同URL的程序包node-cron
n0noob

36

我用过node-cron议程

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

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

1
由于某种原因,当我尝试使用议程时,出现错误ReferenceError:未定义议程。我在NPM上安装了该软件包,在实例化议程之前我需要做任何事情吗?
user379468 2013年

2
我认为您必须将其要求给您的局部变量。var Agenda = require(“ Agenda”);
Ryan Wu

1
我最近写了一篇有关议程,项目设置和项目结构的博客评论goo.gl/5sCNBM
Robin Wieruch 2014年

1
请注意,您需要运行Mongodb才能使用议程
Mark Robson

1
节点计划或议程产生单独的节点系统进程吗?您可以在多节点流程设置中用完它们吗?
普拉萨德席尔瓦

14

我认为最好的排名是

1.节点时间表

2.以后

3.crontab

节点计划的示例如下:

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

也许您可以从节点模块中找到答案。


1
喜欢语法,感谢分享
Overdrivr

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


4
github链接已损坏(404)
kekko12

这很容易理解。我写了一个包,node-cron用作@Tom答案。并具有与您相似的语法。 reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93 '18



1

我写了一个小模块来做到这一点,叫做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作业数组中删除/重新添加条目来实现启动/停止功能。但是它不是表达功能。


4
您应该提到您是作者。
a20

13
@ a20“为此写了一个小模块。”表示他是作者,以防万一您在阅读时略过
PirateApp '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.