在大型项目中,定时任务的应用场景愈来愈广。通常来讲,按照微服务的思想,咱们会将定时任务单独部署一套服务,核心的业务接口独立到另外一个服务中,从而下降相互之间的耦合程度。在须要使用定时任务时,只须要由定时任务微服务定时向核心业务服务发起异步接口调用。node
基于NodeJS来搭建这样一套定时任务的话,咱们可使用现有比较成熟的第三方框架来快速搭建,开发人员只须要关注定时任务的实现逻辑便可。git
在github搜索nodejs schedule的话会有不少类库,好比node-schedule,agenda,node-cron等。之因此选择agenda的话主要由两个缘由:一、agenda接口简单,还可以使用人类可读的cron表达式;二、agenda提供了完整的Restful API接口,以及可统计查看操做的UI界面。github
这样的话,咱们只要在代码中提早定义好定时任务处理逻辑,而后就能够在界面在新增或者移除定时任务安排,而无需从新上线。web
下面咱们就开始从头搭建基于agenda的定时任务。mongodb
1 // 框架引入 2 var express = require('express'); 3 var app = express(); 4 5 var Agenda = require('agenda'); 6 var Agendash = require('agendash'); 7 var L = require('nirvana-logger')('agenda') 8 9 // agenda初始化,并链接MongoDB 10 var agenda = new Agenda({db: {address: 'mongodb://localhost:32768/agenda'}}); 11 12 // 定义一个测试任务 13 agenda.define('testJob', function (job, done) { 14 try { 15 L('hello',job.attrs.data, new Date()) 16 done() 17 }catch (err) { 18 done(new Error(err)) 19 } 20 }) 21 22 // agenda框架启动 23 agenda.on('ready', function () { 24 L("====>>>agenda启动成功<<<<===") 25 agenda.start(); 26 }) 27 28 // Agendash UI界面 29 app.listen(3000); 30 app.use('/dash', Agendash(agenda));
13行:定义一个任务,名称为testJob,后续咱们能够经过该名字安排定时任务。第二个参数是一个函数,用于处理咱们的业务逻辑,须要注意的是,咱们须要在任务完成以后主动调用done方法,这样agenda才会将任务标记为完成。docker
17行:若是任务执行过程当中出现异常(好比网络请求异常)时,须要向done传入一个error对象,agenda会将此任务标记为fail状态。数据库
23行:在agenda链接MongoDB成功后,会触发ready的钩子,咱们才能在这里开始安排定时任务,而且让agenda开始执行定时任务扫描。express
29行:在3000端口启动express,同时使用agendash框架启动agenda的WEB管理界面。npm
执行node命令启动该js文件,若是能在命令行看到“agenda启动成功”则表示agenda链接数据库成功而且成功启动。网络
其实细心的同窗能够,咱们在上面的代码中只是定义了任务,可是并无对进行对任务进行定时运行。
因此接下来咱们将演示如何在WEB界面上对定时任务进进行查询,新增以及删除的操做。
如今咱们能够打开:http://localhost:3000/dash/# 来查看web界面。
四、定时任务界面管理
打开agendash的默认界面是这样
从界面上也能够看出,咱们如今的确并未启动任何定时任务。
点击【Schedule job】,在后面弹出create job界面:
Job name:咱们须要使用的任务名称,即咱们在程序中提早设置好的任务,好比刚才定义的testJob
Schedule:安排定时任务,这里咱们输入但愿定时任务执行的时间点,好比5 minutes。这里时间的支持具体请参考:https://github.com/agenda/human-interval
Repeat every:循环执行定时任务,这里输入循环间隔时间。好比5 seconds。这里须要注意的是schedule安排的任务只会执行一次,repeat任务会一直循环执行。因此这两者通常只须要按需求填一个便可。
Job data:向定时任务传入的额外数据,咱们能够在任务执行时经过job.attr.data获取到这些参数。
点击保存后,咱们的定时任务就开始运行,能够看到控制台开始循环执行打印日志:
同时WEB界面数据将会更新,咱们也能看到定时任务的运行状态:
schedule安排一次性的定时任务也是相似的操做,你们能够本身尝试。
值得注意的是,咱们定义的任务,是能够被重复执行定时任务。
点击某一个定时任务,就能查看到任务的详细信息以及相关操做。
点击右上角的【delete selected】便可删除该定时任务。