no-image

Quartz學習筆記(二)——Cron表示式

                                    

做APP,小程式就上開源眾包。世界盃期間免費領2600元啟動金。
>>>
  

熟悉Linux的肯定對Cron並不陌生。Quartz中的Cron表示式其實也一樣。  

格式

Cron表示式格式

可用字元 有效範圍
秒 Seconds ,- * / 0-59
分 Minutes ,- * / 0-59
時 Hours ,- * / 0-23
日 Day-of-Month ,- * / ? L C W 0-31
月 Month ,- * /  1-12或 JAN-DEC
周 Day-of-Week ,- * /  ?  L C # 1-7或SUN,MON,TUE,WED,THU,FRI,SAT
年 Year (Optional) ,- * / 1970-2099(可不寫)

 

Cron表示式字元含義

* 表示匹配該域的任意值,假如在Minutes域使用*, 即表示每分鐘都會觸發事件。*/7表示立即執行,之後0,7,14…再執行。
? 只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和 DayofWeek會相互影響,為了避免衝突,需要將另一個子表示式的值設為“?”。例如想在每月的20日觸發排程,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最後一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。
表示範圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次。5-20/2表示5,7,9…19觸發。
/ 表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次。
, 表示列出列舉值。例如:在Minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。 
L 表示最後,只能出現在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味著在最後的一個星期四觸發。“6L”表示這個月的倒數第6天。 在使用“L”引數時,不要指定列表或範圍,因為這會導致問題
W 表示有效工作日(週一到週五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在 DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(週一)觸發;如果5日在星期一 到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份。
LW 這兩個字元可以連用,表示在某個月最後一個工作日,即最後一個星期五。 
# 用於確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三,6#3,表示某月的第三個星期五。

 

示例 

就以“Quartz學習筆記(一)——入門”中的引子為例吧

如何實現每週六(中午12點整)給使用者發福利?    0 0 12 ? * SAT 或 0 0 12 ? * 7
如何實現每月10號(上午8點30分)提醒客戶還信用卡?    0 30 8 10 * ?
如何實現每天早上3:30分進行日誌清理?    0 30 3 * * ? 或 0 30 3 ? * *
如何實現6月8號到6月20號每天7點55分開始,每兩個小時提醒我去XX搶紅包,當天21:55結束? 0 55 7-21/2 8-20 6 ?

一些特殊情況

我想每100秒執行一次是 0 0/100 9 * * ? 嗎?

當然不行,就如第一張所示,每個欄位都有範圍的,要是超出範圍了怎麼辦呢?  

我們可以將一個計劃拆分為多個計劃:  

0 0/5 9 * *?
40 1/5 9 * *?
20 3/5 9 * * ?  

這樣,雖然實現了功能,可是不是太Low了?要是我要每137秒一次呢?

再例如,我想從7月12號到8月15號應該怎麼寫? 

所以這些情況,還是用SimpleTrigger吧~ 

 

附一個線上Cron表示式生成工具:http://cron.qqe2.com/


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}