1. 程式人生 > >Quartz中的cronExpression 表示式的格式詳解(超級詳細)

Quartz中的cronExpression 表示式的格式詳解(超級詳細)

(看完之後就可以直接線上生成表示式了。。。。)

cron 表示式的格式


Quartz cron
表示式的格式十分類似於 UNIX cron 格式,但還是有少許明顯的區別。區別之一就是 Quartz 的格式向下支援到秒級別的計劃,而UNIX cron 計劃僅支援至分鐘級。許多我們的觸發計劃要基於秒級遞增的(例如,每45),因此這是一個非常好的差異。 UNIX cron 裡,要執行的作業(或者說命令)是存放在 cron 表示式中的,在第六個域位置上。Quartz cron 表示式存放執行計劃。引用了cron 表示式的 CronTrigger 在計劃的時間裡會與 job關聯上。另一個與 UNIX cron

表示式的不同點是在表示式中支援域的數目。UNIX 給出五個域(分、時、日、月和周)Quartz提供七個域。表 5.1 列出了Quartz cron 表示式支援的七個域。

Quartz Cron 表示式支援到七個域

名稱

是否必須

允許值

特殊字元

0-59

, - * /

0-59

, - * /

0-23

, - * /

1-31

, - * ? / L W C

1-12 或 JAN-DEC

, - * /

1-7 或 SUN-SAT

, - * ? / L C #

空 或 1970-2099

, - * /

月份和星期的名稱是不區分大小寫的。

FRI fri是一樣的。域之間有空格分隔,這和 UNIX cron 一樣。無可爭辯的,我們能寫的最簡單的表示式看起來就是這個了:

* * * ? * *
這個表達會每秒鐘(每分種的、每小時的、每天的)激發一個部署的 job·理解特殊字元 UNIX cron 一樣,Quartzcron 表示式支援用特殊字元來建立更為複雜的執行計劃。然而,Quartz 在特殊字元的支援上比標準UNIX cron 表示式更豐富了。* 星號使用星號(*) 指示著你想在這個域上包含所有合法的值。例如,在月份域上使用星號意味著每個月都會觸發這個 trigger表示式樣例:

0 * 17 * * ?
意義:每天從下午5點到下午
5:59中的每分鐘激發一次 trigger。它停在下午5:59 是因為值 17 在小時域上,在下午 6 點時,小時變為 18 了,也就不再理會這個trigger,直到下一天的下午5點。在你希望 trigger 在該域的所有有效值上被激發時使用* 字元。? 問號

?
號只能用在日和周域上,但是不能在這兩個域上同時使用。你可以認為 ? 字元是"我並不關心在該域上是什麼值。" 這不同於星號,星號是指示著該域上的每一個值。? 是說不為該域指定值。不能同時這兩個域上指定值的理由是難以解釋甚至是難以理解的。基本上,假定同時指定值的話,意義就會變得含混不清了:考慮一下,如果一個表示式在日域上有值11,同時在周域上指定了 WED。那麼是要 trigger 僅在每個月的11號,且正好又是星期三那天被激發?還是在每個星期三的11號被激發呢?要去除這種不明確性的辦法就是不能同時在這兩個域上指定值。只要記住,假如你為這兩域的其中一個指定了值,那就必須在另一個字值上放一個 ?表示式樣例:

0 10,44 14 ? 3 WEB
意義:在三月中的每個星期三的下午 2:10 下午 2:44 被觸發。, 逗號逗號 (,) 是用來在給某個域上指定一個值列表的。例如,使用值 0,15,30,45 在秒域上意味著每15秒觸發一個 trigger表示式樣例:

0 0,15,30,45 * * * ?
意義:每刻鐘觸發一次 trigger/ 斜槓斜槓 (/) 是用於時間表的遞增的。我們剛剛用了逗號來表示每15分鐘的遞增,但是我們也能寫成這樣0/15表示式樣例:

0/15 0/30 * * * ?
意義:在整點和半點時每15秒觸發trigger- 中劃線中劃線 (-) 用於指定一個範圍。例如,在小時域上的 3-8 意味著"3,4,5,6,7 8 點。域的值不允許回捲,所以像 50-10 這樣的值是不允許的。表示式樣例:

0 45 3-8 ? * *
意義:在上午的3點至上午的8點的45分時觸發triggerL 字母
L
說明了某域上允許的最後一個值。它僅被日和周域支援。當用在日域上,表示的是在月域上指定的月份的最後一天。例如,當月域上指定了 JAN 時,在日域上的 L 會促使 trigger 131號被觸發。假如月域上是 SEP,那麼 L 會預示著在930號觸發。換句話說,就是不管指定了哪個月,都是在相應月份的時最後一天觸發 trigger表示式 0 0 8 L * ? 意義是在每個月最後一天的上午8:00 觸發 trigger。在月域上的 * 說明是 "每個月" L 字母用於周域上,指示著周的最後一天,就是星期六 (或者數字7)。所以如果你需要在每個月的最後一個星期六下午的 11:59 觸發trigger,你可以用這樣的表示式 0 59 23 ? * L當使用於周域上,你可以用一個數字與 L 連起來表示月份的最後一個星期X。例如,表示式 0 0 12 ? * 2L 說的是在每個月的最後一個星期一觸發 trigger

不要讓範圍和列表值與 L 連用

雖然你能用星期數(1-7)與 L 連用,但是不允許你用一個範圍值和列表值與 L 連用。這會產生不可預知的結果。

W 字母

W
字元代表著平日 (Mon-Fri),並且僅能用於日域中。它用來指定離指定日的最近的一個平日。大部分的商業處理都是基於工作周的,所以 W 字元可能是非常重要的。例如,日域中的 15W 意味著"離該月15號的最近一個平日。"假如15號是星期六,那麼trigger 會在14(星期四)觸發,因為距15號最近的是星期一,這個例子中也會是17號(譯者Unmi注:不會在17號觸發的,如果是15W,可能會是在14(15號是星期六)或者15(15號是星期天)觸發,也就是隻能出現在鄰近的一天,如果15號當天為平日直接就會當日執行)。W只能用在指定的日域為單天,不能是範圍或列表值。# 井號

#
字元僅能用於周域中。它用於指定月份中的第幾周的哪一天。例如,如果你指定周域的值為 6#3,它意思是某月的第三個週五(6=星期五,#3意味著月份中的第三週)。另一個例子 2#1 意思是某月的第一個星期一 (2=星期一,#1意味著月份中的第一週)。注意,假如你指定 #5,然而月份中沒有第 5 周,那麼該月不會觸發。

示例:

表示式意義

"00 12 * *?" 每天中午12點觸發

"015 10 ? **" 每天上午10:15觸發

"015 10 * *?" 每天上午10:15觸發

"015 10 * * ?*" 每天上午10:15觸發

"015 10 * * ?2005" 2005年的每天上午10:15觸發

"0* 14 * *?" 在每天下午2點到下午2:59期間的每1分鐘觸發

"00/5 14 * *?" 在每天下午2點到下午2:55期間的每5分鐘觸發

"00/5 14,18 ** ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發

"00-5 14 * *?" 在每天下午2點到下午2:05期間的每1分鐘觸發

"010,44 14 ? 3WED" 每年三月的星期三的下午2:102:44觸發

"015 10 ? *MON-FRI" 週一至週五的上午10:15觸發

"015 10 15 *?" 每月15日上午10:15觸發

"015 10 L *?" 每月最後一日的上午10:15觸發

"015 10 ? *6L" 每月的最後一個星期五上午10:15觸發

"015 10 ? * 6L2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發

"015 10 ? *6#3" 每月的第三個星期五上午10:15觸發