Spring定時任務(wù)注解@Scheduled詳解
一 概述
@Scheduled注解是包org.springframework.scheduling.annotation中的一個注解,主要是用來開啟定時任務(wù)。
二 @Scheduled注解的源碼
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { String CRON_DISABLED = "-"; String cron() default ""; String zone() default ""; long fixedDelay() default -1L; String fixedDelayString() default ""; long fixedRate() default -1L; String fixedRateString() default ""; long initialDelay() default -1L; String initialDelayString() default ""; }
根據(jù)注解源碼可知,該注解是方法聲明式注解和注解類型聲明式注解。
三 @Scheduled注解中的主要參數(shù)
fixedDelay
@Scheduled(fixedDelay = 5000) //將一個方法以上一個調(diào)用任務(wù)的完成之間為基準,在上一個任務(wù)完成之后,5s后再執(zhí)行該方法。 public void doSomething() { // something that should execute periodically }
fixedRate
@Scheduled(fixedRate = 5000) //將一個方法以固定速率5s調(diào)用一次執(zhí)行,這個周期是一個任務(wù)開始時間為基準,從上一個任務(wù)開始執(zhí)行后5秒后再調(diào)用一次。 public void doSomething() { // something that should execute periodically }
上述兩個重要的參數(shù)只是提了簡單的定時調(diào)用規(guī)則,當需要更為復雜的調(diào)用時我們可以通過參數(shù)cron進行設(shè)置。
四 復雜調(diào)度之參數(shù)cron
我們可以通過參數(shù)corn來編寫表達式,然后通過表達式來配置任務(wù)的執(zhí)行時間。其中每個corn表達式中至少會存在6個用空格分隔的時間元素,它們順序依次為:
- 秒(0~59)
- 分鐘(0~59)
- 小時(0~23)
- 天(0~31)
- 月(0~11)
- 星期(1~7或者SUN-SAT[SUN,MON,TUE,WED,THU,F(xiàn)RI,SAT])
- 年份(1970~2099)
Seconds Minutes Hours DayofMonth Month DayofWeek
Cron格式中每個時間元素的說明
時間元素 | 可出現(xiàn)的字符 | 有效數(shù)值范圍 |
Seconds | ,- * / | 0~59 |
Minutes | ,- * / | 0~59 |
Hours | ,- * / | 0~23 |
DayofMonth | ,- * / ? L W | 0~31 |
Month | ,- * / | 1~12 |
DayofWeek | ,- * / ? L # | 1~7或者SUN~SAT |
Cron格式中特殊字符說明
字符 | 作用 | 舉例 |
, | 列出枚舉值 | 在Minutes域中使用6,8,則表示6分鐘和8分鐘各觸發(fā)一次 |
- | 表示觸發(fā)的范圍值 | 在Minutes域中使用6-8,則表示從6分鐘到8分鐘之間每分鐘觸發(fā)一次 |
* | 匹配任意值 | 在Minutes域中使用*,則表示每分鐘都會觸發(fā)一次 |
/ | 起始時間開始觸發(fā),每隔固定時間觸發(fā)一次 | 在Minutes域中使用6/8,表示5分鐘觸發(fā)一次,每10分鐘再觸發(fā)一次 |
? | 在DayofMonth和DayofWeek中,用于匹配任意值 | 在DayofMonth域使用?,表示每天都觸發(fā)一次 |
# | 在DayofMonth中,確定第幾個星期幾 | 7#3表示第三個星期六 |
L | 表示最后 | 在DayofWeek中使用6L,表示在最后一個星期五觸發(fā) |
W | 表示有效工作日(周一到周五) | 在DayofMonth使用5W,如果5日是星期六,則將最近的工作日4日觸發(fā)一次 |
注意:LW是可以連用,表示在某個月最后一個工作日,#是用來確定每個月第幾個星期幾的,只能出現(xiàn)在DayofMonth域中。
常用的Cron表達式
每隔5秒執(zhí)行一次:"*/5 * * * * ?"
每隔1分鐘執(zhí)行一次:"0 */1 * * * ?"
每天23點執(zhí)行一次:"0 0 23 * * ?"
每天凌晨1點執(zhí)行一次:"0 0 1 * * ?"
每月1號凌晨1點執(zhí)行一次:"0 0 1 1 * ?"
每月最后一天23點執(zhí)行一次:"0 0 23 L * ?"
每周星期天凌晨1點實行一次:"0 0 1 ? * L"
在26分、29分、33分執(zhí)行一次:"0 26,29,33 * * * ?"
每天的0點、13點、18點、21點都執(zhí)行一次:"0 0 0,13,18,21 * * ?"
每天上午10點,下午2點,4點:"0 0 10,14,16 * * ?"
朝九晚五工作時間內(nèi)每半小時:"0 0/30 9-17 * * ?"
表示每個星期三中午12點:"0 0 12 ? * WED"
每天中午12點觸發(fā):"0 0 12 * * ?"
每天上午10:15觸發(fā):"0 15 10 ? * *"
每天上午10:15觸發(fā):"0 15 10 * * ?"
每天上午10:15觸發(fā):"0 15 10 * * ? *"
2005年的每天上午10:15觸發(fā): "0 15 10 * * ? 2005"
在每天下午2點到下午2:59期間的每1分鐘觸發(fā): "0 * 14 * * ?"
在每天下午2點到下午2:55期間的每5分鐘觸發(fā): "0 0/5 14 * * ?"
在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā): "0 0/5 14,18 * * ?"
在每天下午2點到下午2:05期間的每1分鐘觸發(fā): "0 0-5 14 * * ?"
每年三月的星期三的下午2:10和2:44觸發(fā): "0 10,44 14 ? 3 WED"
周一至周五的上午10:15觸發(fā): "0 15 10 ? * MON-FRI"
每月15日上午10:15觸發(fā): "0 15 10 15 * ?"
每月最后一日的上午10:15觸發(fā): "0 15 10 L * ?"
每月的最后一個星期五上午10:15觸發(fā): "0 15 10 ? * 6L"
2002年至2005年的每月的最后一個星期五上午10:15觸發(fā): "0 15 10 ? * 6L 2002-2005"
到此這篇關(guān)于Spring定時任務(wù)注解@Scheduled詳解的文章就介紹到這了,更多相關(guān)Spring的@Scheduled內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Word與PDF轉(zhuǎn)換為圖片的方法詳解
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)將Word與PDF轉(zhuǎn)換為圖片,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-10-10java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):循環(huán)鏈表和棧
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表、棧的實現(xiàn)方法,結(jié)合實例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中循環(huán)鏈表、棧、的功能、定義及使用方法,需要的朋友可以參考下2021-08-08SpringMVC MethodArgumentResolver的作用與實現(xiàn)
這篇文章主要介紹了SpringMVC MethodArgumentResolver的作用與實現(xiàn),MethodArgumentResolver采用一種策略模式,在Handler的方法被調(diào)用前,Spring MVC會自動將HTTP請求中的參數(shù)轉(zhuǎn)換成方法參數(shù)2023-04-04