1. 概述
定時任務,顧名思義,就是在某個固定的時間點出發某一個事件(任務),顯然,在定義定時任務的過程中,必須要設置任務執行的時間點,但是該任務可能是每天重複執行,隔日重複執行或者是單次執行等等各種不同組合的觸發時間點,這時可以通過表達式設定,如下圖所示:
2. 定時表達式
定時表達式設定爲新引入的通過 cronExpression 來設定的機制,定時表達式設定的文本框可自己手動填寫 cronExpression,也可通過點擊旁邊的「查看預置表達式」按鈕來直接選擇相應的表達式。點擊「查看預置表達式」按鈕時,展開預置表達式窗口,點擊其中的文字說明,則其上的文本框顯示并保存相應的 cronExpression,再次點擊「收起預置表達式」按鈕時收起預置表達式窗口。如下圖所示:
預置表達式有以下幾個:
a. 每月最後一天 19 點 50 分:0 50 19 L * ?
b. 每月最後一個工作日(周一到周五) 19 點 50 分:0 50 19 LW * ?
c. 每月第 4 個周五 19 點 50 分:0 50 19 ? * 6#4
d. 2018 年第 4 季度每天 19 點 50 分:0 50 19 * 10-12 ? 2018
e. 周一到周五早上 9 點和晚上 6 點:0 0 9,18 ? * MON-FRI
3. Cron表達式
Cron表達式爲一個字符串,由 5 個或 6 個空格隔開,分爲 6 或 7 個域,每一個域代表一個時間範圍。
Cron有如下兩種語法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
從左到右(用空格隔開):秒 分 小時 月份中的日期 月份 星期中的日期 年份(可選)。
3.1 域
每一個域可出現的字符如下:
域 | 允許值 | 允許的特殊字符 |
---|---|---|
秒(Seconds) | 0~59的整數 | , - * / 四個字符 |
分(Minutes) | 0-59的整數 | , - * / 四個字符 |
小時(Hours) | 0-23的整數 | , - * / 四個字符 |
日期(DayofMonth) | 0-31的整數(但是需要考慮月的天數) | ,- * ? / L W C 八個字符 |
月份(Month) | 1-12的整數或英文JAN-DEC | , - * / 四個字符 |
星期(DayofWeek) | 1-7的整數或英文SUN-SAT(1=SUN, 2=MON,...) | , - * ? / L C # 八個字符 |
年份(Year) | 1970-2099 | , - * / 四個字符 |
每一個域除了使用數字還可以出現特殊字符,其中特殊字符的含義如下:
字符 | 含義 |
---|---|
* | 表示匹配該域的任意值,假如在 Minutes 域使用 *,即表示每分鍾都會觸發事件; |
? | 只能用在 DayofMonth(日期)和 DayofWeek(星期)兩個域。它也匹配域的任意值,但實際不會。因爲 DayofMonth 和 DayofWeek 會相互影響。例如想在每月的 20 日觸發調度,不管 20 日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?,其中最後一位只能用 ?,而不能使用 *,如果使用 * 表示不管星期幾都會觸發,實際上并不是這樣; |
- | 表示範圍,例如在 Minutes 域使用 5-20,表示從 5 分到 20 分鍾每分鍾觸發一次; |
/ | 表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在Minutes域使用 5/20,則意味着 5 分鍾觸發一次,而 25,45等分别觸發一次; |
, | 表示列出枚舉值。例如:在Minutes域使用 5,20,則意味着在 5 和 20 分每分鍾觸發一次; |
L | 該字符只在 DayofMonth(日期)和 DayofWeek(星期)域中使用,代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最後一天,如一月的 31 号,非閏年二月的 28 号;如果L用在星期中,則表示星期六,等同於7。但是,如果 L 在前面有一個數值 X ,它就具有其他含義了。例如,月份中的 6L 表示該月的倒數第六天;星期域中的 FRIL 表示這個月的最後一個星期五。 |
W | 該字符只能出現在 DayofMonth(日期)域裏,是對前導日期的修飾,表示離該日期最近的工作日(周一到周五)。例如 15W 表示離該月15 号最近的工作日,如果該月15 号是星期六,則匹配 14 号星期五;如果15 日是星期日,則匹配 16 号星期一;如果 15 号是星期二,那結果就是15 号星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定 1W,如果 1 号是星期六,結果匹配的是 3 号星期一,而非上個月最後的那天。W 字符串只能指定單一日期,而不能指定日期範圍; |
LW | 在 DayofMonth 字段可以組合使用 LW,它的意思是當月的最後一個工作日(周一到周五); |
C | 該字符只在 DayofMonth(日期)和 DayofWeek(星期)域中使用,代表“Calendar”的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當於日曆中所有日期。例如:5C 在日期字段中就相當於日曆 5 日以後的第一天;1C 在星期字段中相當於星期日後的第一天; |
# | 該字符只能在 DayofWeek(星期)域中使用,表示當月某個工作日(周一到周五)。如 6#3 表示當月的第三個星期五( 6 表示星期五,#3表示當前的第三個);而 4#5 表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發; |
3.2 示例
Cron表達式示例如下:
注:用戶可參考 Cron 表達式在線生成工具 檢查寫的表達式是否正确,确保正确以後填入。
表達式 | 含義 |
---|---|
*/5 * * * * ? | 每隔 5 秒執行一次 |
0 */1 * * * ? | 每隔 1 分鍾執行一次 |
0 0 */1 * * ? | 每隔 1 小時執行一次 |
0 0 12 * * ? | 每天中午十二點觸發 |
0 0 0,13,18,21 * * ? | 每天的 0 點、13 點、18 點、21 點都觸發一次 |
0 0 0-8 * * ? | 每天的 0-8點,每整點觸發一次 |
0 15 10 ? * * | 每天早上 10:15 觸發 |
0 15 10 * * ? | 每天早上 10:15 觸發 |
0 15 10 * * ? * | 每天早上 10:15 觸發 |
0 15 10 * * ? 2005 | 2005 年的 每天早上 10:15 觸發 |
0 * 14 * * ? | 每天從下午 2 點開始到 2 點 59 分每分鍾一次觸發 |
0 0/5 14 * * ? | 每天從下午 2 點開始到 2 點 55 分結束每 5 分鍾一次觸發 |
0 55/10 14,18 * * ? | 每天的下午 2 點 55 和 6 點 55 分觸發 |
0 10,44 14 ? 3 WED | 三月的每周三的14:10和14:44觸發 |
0 15 10 ? * MON-FRI | 每個周一、周二、周三、周四、周五的10:15觸發 |
0 15 10 15 * ? | 每月 15 号的 10:15 觸發 |
0 15 10 L * ? | 每月的最後一天的 10:15 觸發 |
0 15 10 ? * 6L | 每月最後一個周五的 10:15 觸發 |
0 15 10 ? * 6L 2002-2005 | 2002 年至 2005 年的每月最後一個周五的 10:15觸發 |
0 15 10 ? * 6#3 | 每月的第三個周五的 10:15 觸發 |
0 0 0 L-2 * ? * | 每月倒數第二天(支持 FineReport 10.0,不支持 FineReport 9.0) |