Quartz 的設計允許作業與作業排程分離。将作業與作業排程的分離通過觸發器完成,
Quartz 中的觸發器用來确定作業的觸發時機,其架構提供了一系列觸發器類型,但以下
兩個是最常用的:
• SimpleTrigger 。
• CronTrigger 。
SimpleTrigger 主要用于簡單的排程。例如,如果需要在給定的時間内重複執行作業,
或者間隔固定時間執行作業,可以選擇SimpleTrigger 0 SimpleTrigger 類似與JDK 的Timer 。
如果需要更複雜的作業排程,則可以考慮使用CronTrigger 。該排程器基于
Calendar-like 排程。當需要在除星期六和星期日以外的每天上午10: 30 執行作業時,就
應使用CronTrigger 0 CronTrigger 是基于Unix Cron 的表達式。
Cron 表達式是一個字元串,字元串以5 個或6 個空格隔開,分成6 個或7 個域,每
個域代表一個時間域, Cron 表達式有如下兩種文法格式。
Seconds Minutes Hours DayofMonth Month DayotWeek ¥ear 。
上面是包含7 個域的表達式,還有隻包含6 個域的Cron 表達式。
Seconds Minutes Hours DayofMonth Month DayotWeek
每個域可出現的字元如下。
• Second: 可出現, - * /四個字元,有效範圍為0-59 的整數。
• Minutes: 可出現, - * /四個字元,有效範圍為0-59 的整數。
• Hours: 可出現, - * /四個字元,有效範圍為0-23 的整數。
• DayofMonth: 可出現, -*?/LWC 八個字元,有效範圍為1-31 的整數。
• Month: 可出現, - * /四個字元,有效範圍為1-12 或JAN-DEC 。
• DayotWeek: 可出現, -*?/LC# 八個字元,有效範圍為1-7 或
SUN-SAT 兩個範圍。其中1 表示星期日, 2 表示星期一,依次類推。
• Year: 可出現, - * /四個字元,有效範圍為1970-2099 年。
每個域通常都使用數字,但還可以出現如下特殊字元,它們的含義如下。
• * :表示比對該域的任意值,假如在Minutes 域使用*,即表示在每分鐘都會觸發
事件。
518
完整應用2 簡單工作流系統
• ? :隻能用在DayotMonth 和DayofWeek 兩個域。它也比對該域的任意值,但實
際應用中則不會,因為DayOtMonth 和DayofWeek 會互相影響。例如,想在每月
的20 日觸發排程,無論20 日是星期幾,則隻能使用如下寫法: 13 13 15 20 * ?,
其中最後→位隻能使用?,而不能使用*,如果使用*則表示無論星期幾都會觸發,
但實際并不是這樣。
• - :表示範圍。例如,在Minutes 域使用5-20 ,表示從5 分鐘到20 分鐘内每分鐘
觸發一次。
• I : 表示從起始時間開始觸發,然後每隔固定時間觸發一次。例如,在Minutes
域使用5/20 , 則意味着5 分鐘觸發一次,而在25 , 45 等分鐘時分别觸發一次。
·,:表示列出枚舉值。例如,在Minutes 域使用5 , 20 ,則意味着在5 和20 分鐘
分别觸發一次。
• L :表示最後。隻能出現在DayofWeek 和DayotMonth 域,如果在DayofWeek 域
使用丸,則意味着在最後一個星期四觸發。
·W: 表示有效工作日(星期二到星期五)。隻能出現在DayotMonth 域,系統将
在離指定日期最近的有效工作日觸發事件。例如,在DayotMonth 使用5W ,如果
5 日是星期六,則将在最近的工作日星期一,即4 日觸發。如果5 日是星期一到
星期五中的一天,則就在5 日觸發。須注意的是, W 不會跨月尋找,例如, lW,
1 日恰好是星期六,系統不會在上月的最後一天觸發,而是到3 日觸發。
• LW: 這兩個字元可以連接配接使用,表示某個月最後→個工作日,即最後一個星期五。
• # :用于确定每個月的第幾個星期幾,隻能出現在DayotMonth 域。如在4#5 ,
表示某月的第五個星期三。
下面的Quartz Cron 表達式,表示在周一到周五的每天上午10: 15 分開始執行作業。
o 15 10 ? * MON-FRI
下面的表達式,表示在2002-2005 年中的每個月的最後一個星期五上午10: 15 分
開始執行作業。
o 15 10 ? * 6L 2002-2005