《讓Nodejs來管理定時器任務(wù)later》要點:
本文介紹了讓Nodejs來管理定時器任務(wù)later,希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:node.js web開發(fā)
一個完整的系統(tǒng)少不了定時任務(wù),大多數(shù)情況我們都選用使用Linux CRON,通過操作系統(tǒng)命令進(jìn)行定時任務(wù)。當(dāng)我們要維護(hù)多臺計算機(jī),幾十個,幾百個定時任務(wù)的時候,用CRON會帶來非常大的運維成本??赡軐懙匠绦蛑?,就是一個不錯的選擇了。
Later提供了一個Nodejs的定時任務(wù)解決方案,讓我來看看他是怎么工作的吧??!
目錄
什么是定時任務(wù)?
Later介紹
Later安裝
Later基本使用
Later Schedules – 設(shè)置時間表
Later Time Periods – 時間定義和時間計算
Later Modifiers – 行為修飾符
Later Parsers – 規(guī)則解釋器
Later Occurrences – 時間控制
Later Executing – 啟動運行
定時任務(wù)(計劃任務(wù)),是任務(wù)在約定的時間執(zhí)行已經(jīng)計劃好的工作,這是表面的意思。在Linux中,我們經(jīng)常用到 cron 服務(wù)器來完成這項工作。cron服務(wù)器可以根據(jù)配置文件約定的時間來執(zhí)行特定的作務(wù)。比如我們可以在配置文件中約定每天早上4點,對httpd 服務(wù)器重新啟動,這就是一個計劃任務(wù);
crontab文件的格式:M H D m d cmd.
M: 分鐘(0-59)。
H:小時(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期內(nèi)的天(0~6,0為星期天)。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時,早上八點
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line
關(guān)于CRON的介紹,摘自:http://baike.baidu.com/view/660015.htm
Later是一個基于Nodejs的工具庫,用最簡單的方式執(zhí)行定時任務(wù)。Later可以運行在Node和瀏覽器中。
Later.js官方主頁:http://bunkat.github.io/later/index.html
Later可以運行在Node和瀏覽器中,分別用npm和bower進(jìn)行依賴管理。關(guān)于NPM的介紹,請參考:快速創(chuàng)建基于npm的nodejs庫, 關(guān)于Bower的介紹,請參考:bower解決js的依賴管理
系統(tǒng)環(huán)境
Linux: Ubuntu 12.04.2 LTS 64bit deskop
Nodejs: npm 1.2.21
node v0.11.2
安裝later
~ cd /home/conan/nodejs ~ mkdir nodejs-later && cd nodejs-later ~ sudo npm install later npm http GET https://registry.npmjs.org/later npm http 200 https://registry.npmjs.org/later npm http GET https://registry.npmjs.org/later/-/later-1.1.6.tgz npm http 200 https://registry.npmjs.org/later/-/later-1.1.6.tgz later@1.1.6 node_modules/later
沒有其他包的依賴,這樣就安裝完成了!
創(chuàng)建一個每5分鐘啟動的定時器規(guī)則,輸出啟動時間。
創(chuàng)建啟動文件:app.js
~ vi app.js var later = require('later'); var sched = later.parse.text('every 5 mins'), occurrences = later.schedule(sched).next(10); for(var i=0;i<10;i++){ console.log(occurrences[i]); }
運程程序:
~ node app.js Thu Dec 26 2013 10:45:00 GMT+0800 (CST) Thu Dec 26 2013 10:50:00 GMT+0800 (CST) Thu Dec 26 2013 10:55:00 GMT+0800 (CST) Thu Dec 26 2013 11:00:00 GMT+0800 (CST) Thu Dec 26 2013 11:05:00 GMT+0800 (CST) Thu Dec 26 2013 11:10:00 GMT+0800 (CST) Thu Dec 26 2013 11:15:00 GMT+0800 (CST) Thu Dec 26 2013 11:20:00 GMT+0800 (CST) Thu Dec 26 2013 11:25:00 GMT+0800 (CST) Thu Dec 26 2013 11:30:00 GMT+0800 (CST)
Schedules模塊用來設(shè)置定時規(guī)則,提供3種規(guī)則設(shè)置。
Basic schedules:基本時間表
Composite schedules: 組合時間表
Exception schedules: 異常時間表
1). Basic schedules:基本時間表
設(shè)置每日10:15am , 10:45am啟動
var basic = {h: [10], m: [15,45]};
2). Composite schedules: 組合時間表
設(shè)置每日10:15am , 10:45am, 和17:40pm 啟動
var composite = [ {h: [10], m: [15,45]}, {h: [17], m: [30]} ];
3). Exception schedules: 異常時間表
用于設(shè)置一下無效的日期:設(shè)置 每年1月 和 每周一,六,日 時間表無效
var exception = [ {M: [1]}, {dw: [1,6,7]} ];
4). 程序?qū)崿F(xiàn)
新建測試文件:schedules.js
~ vi schedules.js var later = require('later'); var basic = {h: [10], m: [15,45]}; var composite = [ basic, {h: [17], m: [30]} ]; var exception = [ {M: [1]}, {dw: [1,6,7]} ]; var sched = { schedules:composite, exceptions:exception }; later.date.localTime(); console.log("Now:"+new Date()); var occurrences = later.schedule(sched).next(10); for(var i = 0; i < occurrences.length; i++) { console.log(occurrences[i]); }
運行程序
~ node schedules.js Now:Thu Dec 26 2013 11:40:27 GMT+0800 (CST) Thu Dec 26 2013 17:30:00 GMT+0800 (CST) Mon Dec 30 2013 10:15:00 GMT+0800 (CST) Mon Dec 30 2013 10:45:00 GMT+0800 (CST) Mon Dec 30 2013 17:30:00 GMT+0800 (CST) Tue Dec 31 2013 10:15:00 GMT+0800 (CST) Tue Dec 31 2013 10:45:00 GMT+0800 (CST) Tue Dec 31 2013 17:30:00 GMT+0800 (CST) Mon Feb 03 2014 10:15:00 GMT+0800 (CST) Mon Feb 03 2014 10:45:00 GMT+0800 (CST) Mon Feb 03 2014 17:30:00 GMT+0800 (CST)
當(dāng)前時間為:2013-12-26 11:40:27
從結(jié)果中看到,接下來的10個時間點。
第1個:2013-12-26 17:30:00
第2個:2013-12-30 10:15:00 (排除了2013-12-27,28,29的3天)
第8個:2014-02-01 10:15:00 (排除了2014的1月份)
還有比這種方式,更便捷定義時間表的么!!太神奇了!
Time Periods模塊用于時間定義和時間計算。
1). 時間定義
在之前的代碼中,我們是這樣的定義的
{h: [17], m: [30]}
h代表小時,m代表分鐘。
時間定義完整列表:
Second, s: 秒, 取值范圍:[0-59]
minute, m:分, 取值范圍:[0-59]
hour, h: 時, 取值范圍:[0-23]
time, t: 秒每日, 取值范圍:[0-86399]
day, D: 日, 取值范圍:[1-31]
dayOfWeek, dw, d: 日每周, 取值范圍:[1-7]
dayOfYear, dy: 日每年,取值范圍:[1-365]
weekOfMonth, wm: 周每月,取值范圍:[1-5]
weekOfYear, wy: 周每年,取值范圍:[1-52]
month, M: 月,取值范圍:[1-12]
year, Y: 年,取值范圍:[1970-2099]
2). 時間計算
name: 名稱
range: 取值范圍計數(shù)
val(date): 當(dāng)前時間段的值
isValid(date, value): 檢驗輸入是否是當(dāng)前時間段的值
extent(date): 取值范圍
start(date): 開始時間點
end(date): 結(jié)束時間點
next(date, value): value之后的時間點
prev(date, value): value之前的時間點
3). 程序?qū)崿F(xiàn)
新建測試文件:time.js
~ vi time.js var later = require('later'); later.date.localTime(); var d = new Date(); console.log(d); console.log(later.hour.name); console.log(later.hour.range); console.log(later.hour.val(d)); console.log(later.hour.isValid(d, 2)); console.log(later.hour.isValid(d, 12)); console.log(later.hour.extent()); console.log(later.hour.start(d)); console.log(later.hour.end(d)); console.log(later.hour.next(d, 5)); console.log(later.hour.prev(d, 21));
運行程序
~ node time.js Thu Dec 26 2013 12:30:42 GMT+0800 (CST) hour 3600 12 false true [ 0, 23 ] Thu Dec 26 2013 12:00:00 GMT+0800 (CST) Thu Dec 26 2013 12:59:59 GMT+0800 (CST) Fri Dec 27 2013 05:00:00 GMT+0800 (CST) Wed Dec 25 2013 21:59:59 GMT+0800 (CST)
輸出結(jié)果的解釋:
當(dāng)前時間:2013-12-26 12:30:42
以小時定義時間
每小時3600個計數(shù)點
當(dāng)前時間段的的值是12
檢查2不是當(dāng)前時間段的值
檢查12不是當(dāng)前時間段的值
取值范圍[0,23]
當(dāng)前時間段的開始時間點:12:00:00
當(dāng)前時間段的結(jié)束時間點:12:59:59
下一個周期第5個時間段開始點:2013-12-27 05:00:00
上一個周期第21個時間段結(jié)束點:2013-12-25 21:59:59
Later可以編寫自定義修飾符,可以改變現(xiàn)有的時間周期的行為,通過 _(modifier-id) 這樣的格式定義。
after(_a): 之后時間修飾符
before(_b): 之前時間修飾符
1). after(_a)
以小時定義,設(shè)置17:00pm之前都是合法的時間
var demo1_a = {schedules: [{h_a: [17]}]}; #等價定義 var demo1 = {schedules: [{h: [17,18,19,20,21,22,23]}]};
2). before(_b)
以小時定義,設(shè)置17:00pm之后都是合法的時間
var demo2_b = {schedules: [{h_b: [17]}]}; #等價定義 var demo2 = {schedules: [{h: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]}]};
3). 程序?qū)崿F(xiàn)
新建文件:modifiers.js
~ vi modifiers.js var later = require('later'); later.date.localTime(); console.log("Now:"+new Date()); var demo1_a = {schedules: [{h_a: [17]}]}; var demo2_b = {schedules: [{h_b: [17]}]}; var occurrences = later.schedule(demo1_a).next(3); for(var i = 0; i < occurrences.length; i++) { console.log(occurrences[i]); } occurrences = later.schedule(demo2_b).next(3); for(var i = 0; i < occurrences.length; i++) { console.log(occurrences[i]); }
運行程序
~ node modifiers.js Now:Thu Dec 26 2013 13:04:06 GMT+0800 (CST) Thu Dec 26 2013 17:00:00 GMT+0800 (CST) Thu Dec 26 2013 18:00:00 GMT+0800 (CST) Thu Dec 26 2013 19:00:00 GMT+0800 (CST) Thu Dec 26 2013 13:04:06 GMT+0800 (CST) Thu Dec 26 2013 14:00:00 GMT+0800 (CST) Thu Dec 26 2013 15:00:00 GMT+0800 (CST)
當(dāng)前時間:2013-12-26 13:04:06
17點后的時間表(h_a):17:00:00
17點前的時間表(h_b):13:04:06
Later支持我們可以定義自己的修飾符,有興趣的同學(xué)自己查文檔吧。
Parsers模塊提供了3種規(guī)則解釋器,方便定義時間表。
Recur: 鏈?zhǔn)紸PI定義
Cron Parser: CRON格式定義
Text Parser:自然語言定義
1). Recur: 鏈?zhǔn)紸PI定義
設(shè)置每小時第5分0秒啟動
var sched = later.parse.recur().on(5).minute();
時間定義API
second(); minute(); hour(); time(); dayOfWeek(); dayOfWeekCount(); dayOfMonth(); dayOfYear(); weekOfMonth(); weekOfYear(); month(); year();
時間計算API
on(vals): 設(shè)置時間值
first(): 最小的時間值
last(): 最大的時間值
onWeekend(): 周末,等價于on(1,7).dayOfWeek()
onWeekday(): 工作日,等價于on(2,3,4,5,6).dayOfWeek()
every(val): 循環(huán)每個時間
after(val): 在之后
before(val): 在之前
startingOn(val): 每個時間段開始的偏移量
between(start, end): 在兩個時間之間
and():
except():
customPeriod(id):
customModifier(id, vals):
2). Cron Parser: CRON格式定義
通過原CRON格式進(jìn)行定義。
設(shè)置每小時第5分0秒啟動
var cron = later.parse.cron('5 * * * *');
3). Text Parser:自然語言定義
通過關(guān)鍵字格式進(jìn)行定義。
var text = later.parse.text('every 5th mins');
時區(qū)設(shè)置
//默認(rèn)UTF時區(qū) later.date.UTC(); //設(shè)置本地時區(qū) later.date.localTime();
構(gòu)造對象
var schedule = {schedules: [{m: [5]}]}; var occurrences = later.schedule(schedule);
時間控制API
later.schedule(schedule).next(count, start, end): 取下N個有效時間點
later.schedule(schedule).prev(count, start, end): 取上N個有效時間點
later.schedule(schedule).nextRange(count, start, end): 取下N個有效時間段
later.schedule(schedule).prevRange(count, start, end): 取上N個有效時間段
Executing模塊定義了setTimeout和setInterval兩種方式,實現(xiàn)運行。
setTimeout: 設(shè)置一段時間后運行,只運行1次
setInterval: 循環(huán)運行,直到clear
1). setTimeout
定義:5秒后運行,只運行一次!
新建文件:settimeout.js
~ vi settimeout.js var later = require('later'); later.date.localTime(); console.log("Now:"+new Date()); var sched = later.parse.recur().every(5).second(), t = later.setTimeout(function() { test(5); }, sched); function test(val) { console.log(new Date()); console.log(val); }
運行程序
~ node settimeout.js Now:Thu Dec 26 2013 14:12:36 GMT+0800 (CST) Thu Dec 26 2013 14:12:40 GMT+0800 (CST) 5
2). setInterval
定義:2秒后運行,循環(huán)運行,直到15秒后,clear停止!
新建文件:setinterval.js
~ vi setInterval.js var later = require('later'); later.date.localTime(); console.log("Now:"+new Date()); var sched = later.parse.recur().every(2).second(), t = later.setInterval(function() { test(Math.random(10)); }, sched); function test(val) { console.log(new Date()); console.log(val); } setTimeout(function(){ t.clear(); console.log("Clear"); },15*1000);
運行程序
~ node setinterval.js Now:Thu Dec 26 2013 14:17:54 GMT+0800 (CST) Thu Dec 26 2013 14:17:56 GMT+0800 (CST) 0.5084630874916911 Thu Dec 26 2013 14:17:58 GMT+0800 (CST) 0.47506075259298086 Thu Dec 26 2013 14:18:00 GMT+0800 (CST) 0.957129133399576 Thu Dec 26 2013 14:18:02 GMT+0800 (CST) 0.7480122991837561 Thu Dec 26 2013 14:18:04 GMT+0800 (CST) 0.9212428922764957 Thu Dec 26 2013 14:18:06 GMT+0800 (CST) 0.030472515616565943 Thu Dec 26 2013 14:18:08 GMT+0800 (CST) 0.9528024469036609 Clear
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/14634.html