SpringBoot - 第三十二章 | @Scheduled 建立計劃任務
不管在大大小小的專案上,都會遇到一些需要定時去處理的事務,例如:提醒、寄信、結算⋯等等之類的操作;或是在一個固定的循環時間上需進行的動作,例如:檢查、更新、刪除⋯等等。
建立計劃任務
依照官方範例,構建一個應用程序,使用Spring的@Scheduled註釋每五秒打印一次當前時間。
建立 ScheduledTasks
在Scheduled當特定的方法運行註解定義。注意:此示例使用
fixedRate
,指定從每次調用的開始時間開始測量的方法調用之間的間隔。還有其他選項 ,例如fixedDelay
,它指定從完成任務開始測量的調用之間的間隔。你還可以使用 @Scheduled(cron=”. . .”) 表達式進行更複雜的任務調度。
注意:要調度的方法必須具有void返回,並且不得指望任何參數。如果該方法需要與應用程序上下文中的其他對象進行交互,則通常會通過依賴項注入來提供這些對象。
修改 Chapter32Application (啟用定時任務)
@EnableScheduling
確保建立後台任務執行程序。沒有它,沒有任何安排。
測試
1 |
|
顯示日誌輸出,你可以從日誌中看到它在後台線程上。你應該每5秒鐘看一次計劃任務。
@Scheduled 詳細介紹
上一次執行完畢時間點之後5秒再執行。
1
2
3
45000) (fixedDelay=
public void doSomething() {
// something that should execute periodically
}上一次開始執行時間點之後5秒再執行。
1
2
3
45000) (fixedRate=
public void doSomething() {
// something that should execute periodically
}第一次延遲1秒後執行,之後按fixedRate的規則每5秒執行一次
1
2
3
41000, fixedRate=5000) (initialDelay=
public void doSomething() {
// something that should execute periodically
}簡單的定期調度表達不夠,則可以提供cron表達式。例如,以下僅在工作日執行
1
2
3
4"*/5 * * * * MON-FRI") (cron=
public void doSomething() {
// something that should execute on weekdays only
}
cron 表達式說明
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小時,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,星期一,星期二…,注意:不是第1週,第二週的意思,另外:1表示星期天,2表示星期一。
* 第7為,年份,可以留空,取值1970-2099
cron 特殊符號說明
符號 | 說明 |
---|---|
(*)星號 | 可以理解為每的意思,每秒,每分,每天,每月,每年… |
(?)問號 | 問號只能出現在日期和星期這兩個位置,表示這個位置的值不確定, 每天3點執行,所以第六位星期的位置,我們是不需要關注的, 就是不確定的值。同時:日期和星期是兩個相互排斥的元素, 通過問號來表明不指定值。比如,1月10日,比如是星期1, 如果在星期的位置是另指定星期二,就前後衝突矛盾了。 |
(-)減號 | 表達一個範圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12 |
(,)逗號 | 表達一個列表值,如在星期字段中使用“1,2,4”,則表示星期一,星期二,星期四 |
(/)斜杠 | 如:x/y,x是開始值,y是步長,比如在第一位(秒) 0/15就是, 從0秒開始,每15秒,最後就是0,15, 30,45,60 另:*/y,等同於0/y |
cron 在線產生器
http://cron.qqe2.com/
http://www.pppet.net/
http://www.bejson.com/othertools/cron/
https://www.beejson.com/tool/cron.html
註:以上參考了
Spring 的 Scheduling Tasks 文章。
程序猿DD 的 Spring Boot中使用@Scheduled创建定时任务 文章。
oKong 的 SpringBoot | 第二十二章:定时任务的使用文章。