有没有适用于Node.js的作业调度库?

161

是否有一种类似于cron的库可以让我在特定时间(例如15:30,而不是x小时后)安排运行某些函数?如果没有这样的库,那么应该如何实现?我应该设置回调函数每秒被调用并检查时间,并启动计划在该时间运行的作业吗?


4
node-cron似乎是一个非常好的选项。 - JtR
var schedule = require('node-schedule'); 是最好的事情。干杯!!! - Saumyajit
11个回答

125

5
你是否将cronjob声明写在app.js/scripts.js中? - ArVan
node-cron 能否允许你从 node.js 编辑系统 cron 作业?它是否依赖于正在运行的 node 进程?或者它能否允许你在主进程终止后仍然运行程序? - Ajar
6
不,终止 Node.js 进程后,所有作业都将丢失。node-cron 不附带 cron 表。 - DarkLeafyGreen
2
我猜是这样的@ChrisC。如果我没有使用任何框架,我会在app.js中声明cron。在sails.js中,我会在bootstrap中完成。 - ArVan
2
@arVan 如果你有兴趣,我已经开始在 agenda 上添加 Waterline 支持了:https://github.com/mikermcneil/agenda (虽然刚刚开始,但下周应该会有一些可用的进展)。 - mikermcneil
显示剩余4条评论

45

node-schedule 是一个类似于cron和非类似于cron的Node作业调度程序。


2
这种方法避免了有时候令人困惑的crontab语法,而且在我看来更易读。 - Simon East
就像议程一样,它似乎提供了持久性0.1.13。 - drdrej
5
根据文档,node-schedule不提供持久性。请注意,node-schedule仅用于进程内调度,即只要您的脚本在运行,计划的作业才会触发,当执行完成时,该计划将消失。 - Mike Hedman

37

agenda是一个适用于Node.js的轻量级工作调度程序。这将对你有所帮助。


1
日程表基于node-cron,具有持久层(mongo)。因此,上面的答案更好。 - drdrej
53
澄清一下,作为议程的作者,它实际上根本不是基于node-cron的... - Ryan
1
议程库是唯一最好的库,因为设置简单,用户使用方便。向Ryan致敬! - Vimalraj Selvam
5
我发现agenda的行为不一致,不建议使用它。请查看未解决的问题和拉取请求,自行决定是否使用。 - Russbear
2
请注意,Agenda 目前并不适用于生产环境。它存在 内存泄漏 问题和其他缺陷,请先仔细检查问题。虽然它还有很多 bug,但一旦问题解决,它看起来会很有前途。 - Sebastian
显示剩余2条评论

15

later.js 是一个相当不错的 JavaScript "调度程序" 库。可以在 Node.js 或 Web 浏览器中运行。


3
我尝试了这个帖子中的一些建议,但我发现这个模块是最易于使用和直接的...谢谢!其中"user-friendly"指易于使用、方便用户操作的。 - Gene Bo
对于任何使用这个库的人 - 这里 是一个维护的分支。 - Naz

12
I am using kue: https://github.com/learnboost/kue . 它非常不错。
官方功能及我的评论:
延迟任务。 - 如果您想让作业在特定时间运行,请计算该时间与现在之间的毫秒数。调用job.delay(milliseconds)(文档中说是分钟,这是错误的)。不要忘记在初始化作业时添加"jobs.promote();"。 任务事件和进度发布订阅。 - 我不理解它。 丰富的集成UI。 - 非常有用。您可以在集成UI中检查作业状态(完成、运行、延迟),而无需编写任何代码。您还可以在UI中删除旧记录。 无限滚动 - 有时不起作用。必须刷新。 UI进度指示 - 对于耗时的工作很好。 任务特定日志记录 - 因为它们是延迟任务,所以您应该在作业中记录有用的信息,并通过UI稍后进行检查。 由Redis驱动 - 非常有用。当您重新启动Node.js应用程序时,所有作业记录仍然存在,并且计划的作业也将执行! 可选重试 - 不错。 全文搜索功能 - 很棒。 RESTful JSON API - 听起来不错,但我从未使用过。

编辑:

  1. kue不是类似于cron的库。
  2. 默认情况下,kue不支持重复运行的作业(例如每个星期日)。

6
Kue是一个工作队列,而不是调度程序。 - Leonid Beschastny
1
@LeonidBeschastny Kue是一个作业队列。它也是一个调度程序,因为它可以“让我安排某些函数在特定时间运行”。 - Vince Yuan
我曾认为Kue任务只能被延迟,而不能被安排在特定的时间。 - Leonid Beschastny
@LeonidBeschastny 你说得对。Kue没有提供API来安排工作到特定的时间。但正如我所提到的,“如果您想让工作在特定时间运行,请计算该时间与现在之间的毫秒数。调用job.delay(毫秒)即可(文档中写的是分钟,这是错误的)。 "这很容易。 - Vince Yuan
1
你可以尝试使用kue-scheduler,它类似于aganda。 - Fruch

10

您可以使用timexe

它使用简单,轻量级,没有依赖关系,相对于cron有更好的语法,分辨率为毫秒,并且可以在浏览器中工作。

安装:

npm install timexe

使用:

var timexe = require('timexe');
var res = timexe("* * * 15 30", function(){ console.log("It's now 3:30 pm"); });

(我是作者)


请问我能得到一些例子吗? - Alex
1
请查看Github上的示例:https://github.com/paragi/timexe - Simon Rigét

9

node-crontab 可以让你通过node.js编辑系统定时任务。使用这个库可以在主进程终止后仍然运行程序。声明:我是这个库的开发者。


如果节点服务器重置,它会持续存在吗? - jonperl
找到了:https://dev59.com/3G035IYBdhLWcg3wE71s#5636298 - jonperl
是的,工作被持久化了。 - Blago
它是GPL许可的,因此不能在商业项目中使用。 - drdrej
6
现在的许可证是 MIT。 - Blago

3
我是node-runnr的作者。它有一个非常简单的方法来创建作业。同时,声明时间和间隔也非常容易和清晰。 例如,要在每10分钟20秒执行一次作业,
Runnr.addIntervalJob('10:20', function(){...}, 'myjob')

每天在上午10点和下午3点完成一项工作,

Runnr.addDailyJob(['10:0:0', '15:0:0'], function(){...}, 'myjob')

这很简单。更多细节请参考:https://github.com/Saquib764/node-runnr

2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接