1. 程式人生 > 其它 >@Scheduled引數及cron表示式解釋

@Scheduled引數及cron表示式解釋

@Scheduled支援以下8個引數:
1.cron:表示式,指定任務在特定時間執行;
2.fixedDelay:表示上一次任務執行完成後多久再次執行,引數型別為long,單位ms;
3.fixedDelayString:與fixedDelay含義一樣,只是引數型別變為String;
4.fixedRate:表示按一定的頻率執行任務,即每次開始執行的時間間隔一致,引數型別為long,單位ms;
5.fixedRateString: 與fixedRate的含義一樣,只是將引數型別變為String;
6.initialDelay:表示延遲多久再第一次執行任務,引數型別為long,單位ms;
7.initialDelayString:與initialDelay的含義一樣,只是將引數型別變為String;
8.zone:時區,預設為當前時區。
cron表示式是一個字串,以空格分開共6個域:
[秒] [分] [時] [日] [月] [周]
spring自帶的定時任務cron表示式不支援年
如圖:

上圖類中有如下原始碼:

private void parse(String expression) throws IllegalArgumentException {
String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
if (!areValidCronFields(fields)) {
throw new IllegalArgumentException(String.format(
"Cron expression must consist of 6 fields (found %d in \"%s\")", fields.length, expression));
}
doParse(fields);
}

private static boolean areValidCronFields(String[] fields) {
return (fields != null && fields.length == 6);
}

程式碼中expression引數即cron表示式,所以在spring自帶的定時任務中正確的cron表示式只能是6個域,否則會丟擲IllegalArgumentException提示:Cron expression must consist of 6 fields(cron表示式必須由6個域組成)。

域 必填 允許值 允許的萬用字元
秒(seconds) 是 0-59整數 , - * /
分(minutes) 是 0-59整數 , - * /
時(hours) 是 0-23整數 , - * /
日(daysOfMonth) 是 1-31整數(需要考慮月的天數) , - * ? / L W
月(months) 是 1-12整數 或 JAN-DEC , - * /
周 (daysOfWeek) 是 1-7整數 或 SUN-SAT , - * ? / L #
萬用字元說明:
*:表示匹配該域的任意值。在minutes域使用 * 表示每分鐘。在months裡表示每個月。在daysOfWeek域表示一週的每一天。
?:只能用在daysofMonth和daysofWeek兩個域,表示不指定值,當兩個子表示式其中之一被指定了值以後,為了避免衝突,需要將另一個子表示式的值設為 ?。因為daysofMonth和daysofWeek會相互影響。例如想在每月的2號觸發排程,不管2號是周幾,則只能使用如下寫法:0 0 0 2 * ?, 其中最後一位只能用?,而不能使用*,如果使用*表示不管周幾都會觸發。
-:表示範圍。例如在minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次
/:表示起始時間開始觸發,然後每隔固定時間觸發一次。例如在minutes域使用5/20,則意味著從當前小時的第5分鐘開每20分鐘觸發一次。
,:表示列出列舉值。例如:在minutes域使用5,20,則意味著在5分和20分時各觸發一次。
L:表示最後,是單詞“last”的縮寫,只能出現在daysofWeek和dayofMonth域。在daysofWeek域使用5L意思是在指定月的最後的一個星期四觸發。在dayofMonth域使用5L或者FRIL意思是在指定月的倒數第5天觸發。在使用L引數時,不要指定列表或範圍。
W:表示有效工作日(週一到週五),只能出現在daysofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在daysofMonth使用5W,如果5號是週六,則將在最近的工作日週五,即4號觸發。如果5號是週日,則在6日(週一)觸發。如果5日在星期一到星期五中的一天,則就在5日觸發。另外,W的最近尋找不會跨過月份 。
LW:這兩個字元可以連用,表示指定月的最後一個工作日。
#:用於確定每個月第幾個周幾,只能出現在daysofMonth域。例如在4#2,表示某月的第二個週三。
常用表示式示例:
0/2 * * * * ? 表示每2秒 執行任務
0 0/2 * * * ? 表示每2分鐘 執行任務
0 0 2 1 * ? 表示在每月的1日的凌晨2點調整任務
0 15 10 ? * MON-FRI 表示週一到週五每天上午10:15執行作業
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點
0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時
0 0 12 ? * WED 表示每個星期三中午12點
0 0 12 * * ? 每天中午12點觸發
0 15 10 ? * * 每天上午10:15觸發
0 15 10 * * ? 每天上午10:15觸發
0 15 10 * * ? 每天上午10:15觸發
0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鐘觸發
0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鐘觸發
0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鐘觸發
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發
0 15 10 ? * MON-WED,SAT 週一至週三和週六的上午10:15觸發
0 15 10 15 * ? 每月15日上午10:15觸發
0 15 10 L * ? 每月最後一日的上午10:15觸發
0 15 10 ? * 6L 每月的最後一個星期五上午10:15觸發
0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發
參考網站:

http://www.bejson.com/othertools/cron/
https://www.cnblogs.com/javahr/p/8318728.html