在大型項目中,定時任務的應用場景愈來愈廣。通常來講,按照微服務的思想,咱們會將定時任務單獨部署一套服務,核心的業務接口獨立到另外一個服務中,從而下降相互之間的耦合程度。在須要使用定時任務時,只須要由定時任務微服務定時向核心業務服務發起異步接口調用。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】便可刪除該定時任務。