SpringBoot系列 定時器

2022-01-31 15:26:43 字數 4397 閱讀 6288

定時器功能在專案裡面往往會用到,比如定時傳送郵件、定時釋放資料庫資源;這裡記錄一下springboot對定時器的支援的簡單例項

cron表示式是乙個字串,字串以5或6個空格隔開,分為6或7個域,每乙個域代表乙個含義,cron有如下兩種語法格式:

seconds minutes hours dayofmonth month dayofweek year或

seconds minutes hours dayofmonth month dayofweek

每乙個域可出現的字元如下:

seconds  可出現", - * /"四個字元,有效範圍為0-59的整數

minutes  可出現", - * /"四個字元,有效範圍為0-59的整數

hours  可出現", - * /"四個字元,有效範圍為0-23的整數

dayofmonth  可出現", - * / ? l w c"八個字元,有效範圍為0-31的整數

month  可出現", - * /"四個字元,有效範圍為1-12的整數或jan-dec

dayofweek  可出現", - * / ? l c #"八個字元,有效範圍為1-7的整數或sun-sat兩個範圍。1表示星期天,2表示星期一, 依次類推

year  可出現", - * /"四個字元,有效範圍為1970-2023年

每乙個域都使用數字,但還可以出現如下特殊字元,它們的含義是:

(1)*  表示匹配該域的任意值,假如在minutes域使用*, 即表示每分鐘都會觸發事件。

(2)?  只能用在dayofmonth和dayofweek兩個域。它也匹配域的任意值,但實際不會。因為dayofmonth和dayofweek會相互影響。例如想在每月的20日觸發排程,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最後一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。

(3)-  表示範圍,例如在minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次

(4)/  表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次.

(5),  表示列出列舉值值。例如:在minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。

(6)l  表示最後,只能出現在dayofweek和dayofmonth域,如果在dayofweek域使用5l,意味著在最後的乙個星期四觸發。

(7)w  表示有效工作日(周一到周五),只能出現在dayofmonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在 dayofmonth使用5w,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(周一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,w的最近尋找不會跨過月份

(8)lw  這兩個字元可以連用,表示在某個月最後乙個工作日,即最後乙個星期五。

(9)#  用於確定每個月第幾個星期幾,只能出現在dayofmonth域。例如在4#2,表示某月的第二個星期三。

舉幾個例子:

"0 0 2 1 * ? * "  表示在每月的1日的凌晨2點排程任務

"0 15 10 ? * mon-fri"   表示周一到周五每天上午10:15執行作業

"0 15 10 ? 6l 2002-2006"   表示2002-2023年的每個月的最後乙個星期五上午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 15 10 * * ?   2005" 2023年的每天上午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-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"   2023年至2023年的每月的最後乙個星期五上午10:15觸發

"0 15 10 ? * 6#3"   每月的第三個星期五上午10:15觸發

0 0 * * * ?     每隔乙個小時執行一次

0 0/10 * * * ?      每隔十分鐘執行一次

0 * * * * ?     每隔一分鐘執行一次

上面的例子我沒有測試過,如果要用大家最好自己先進行測試。

在啟動類加註解: @enablescheduling //允許支援定時器了

/**

* 啟動主類,springboot的入口

* springboot 預設掃瞄的類是在啟動類的當前包和下級包 */

@enablescheduling

//允許支援定時器了

public

class

public

static

void

main(string args)

}

編寫定時器類

/**

* 測試定時器 */

@component

public

class

testscheduler

}

效果

2021-03-09更新

當有多個方法使用@scheduled註解時,就會建立多個定時任務到任務列表中,當其中乙個任務沒執行完時,其它任務在阻塞佇列當中等待,因此,所有的任務都是按照順序執行的

/**

* 測試定時器 */

那麼要如何實現定時器多執行緒去執行呢?

我們可以配置定時任務執行緒池

/**

* 定時器執行緒池配置 */

或者使用@async優雅非同步呼叫

/**

* 測試定時器 */

兩三個註解就可以輕鬆實現定時器,很強很簡單

**已經開源、託管到我的github、碼雲:

github:

碼雲:

SpringBoot之定時器

當我們需要在程式中定時執行乙個任務的時候,就需要定時器了。同傳統的spring專案相比,在基於springboot實現的專案中新增定時器十分容器,那具體怎麼做呢?2.在我們需要定時執行的方法上新增註解 scheduled 3.例項 import org.springframework.schedul...

springBoot使用定時器

configuration enablescheduling public class quartzconfig bean public trigger uploadtasktrigger component public class taskjob extends quartzjobbean da...

學習 SpringBoot 定時器

在springboot啟動類上 加入註解 enablescheduling 在定時器任務的方法上加上註解 scheduled fixedrate 5000 如果該類未被spring管理 那麼需要加上 component 才能被 componentscan basepackages 掃瞄到 sched...