天天看點

Quartz 裡的觸發器及Cron 表達式

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