定時器--Spring--SpringBoot

SpringBoot定時器

最近在寫項目時,遇見一個需求:做一個任務隊列,並分配出相應的接口給任務系統使用;同時還要定時檢測數據庫中是否有新的任務沒有添加到隊列中。做隊列操作,Java中有提供相應的API–Queue,同List一樣,Queue也是繼承於Collection接口,具體的操作不在這裏詳細介紹,可自行查詢相關API文檔。

在Spring中,有集成的定時器功能:分別是TimerTask和Quartz,我們只需要拿過來直接用即可。在本文中,不詳細的說明這兩者的區別,只拿過來用。當然在Spring框架中,有屬於Spring自己的定時器ScheduledTask,這個定時器相當於輕量級的Quartz,本文中的使用就是以Quartz爲例。

一.精確度和功能

Quartz可以通過cron表達式精確到特定時間執行,而TimerTask不能。
Quartz擁有TimerTask所有的功能,而TimerTask則沒有。

二. 任務類的數量

Quartz每次執行都創建一個新的任務類對象。
TimerTask則每次使用同一個任務類對象。

三. 異常的處理

Quartz的某次執行任務過程中拋出異常,不影響下一次任務的執行,當下一次執行時間到來時,定時器會再次執行任務
TimerTask則不同,一旦某個任務在執行過程中拋出異常,則整個定時器生命週期就結束,以後永遠不會再執行定時器任務。

四.使用方法

在SpringBoot中,想使用定時器很簡單,不需要配置xml文件,只需要加上註解既可。

首先在入口類加上@EnableScheduling註解,以便系統開啓任務計劃;如果不加這個註解,定時器是無法正常使用的。然後創建相應的方法,並在方法上加上@Scheduled註解,這個註解大致有五種參數:詳細見下圖

我在這裏主要使用了initialDelay和fixedDelay,其中initialDelay是設定定時器第一次啓動時間,我這裏設定的是項目啓動10分鐘後開始執行定時器,那麼對應的值就是1000*60*10,由此可見,該屬性的值是以毫秒數爲單位。fixedDelay是設定定時器固定執行的頻率,比如我這裏設定的是定時任務開啓後,每隔1分鐘執行一次,對應的屬性值就是1000*60。如果你想在項目啓動時,就執行定時器,那麼請使用cron表達式。具體代碼如下:

@Scheduled(cron="0 0 12 * * ?")

這個意思是設定定時器在每天中午的12點執行,如果你想設定其它時間執行,請參考cron表達式的寫法:

"0 0 12 * * ?"    每天中午十二點觸發 
"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 0/5 14,18 * * ?"    每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發 
"0 0-5 14 * * ?"    每天14:00至14:05每分鐘一次觸發 
"0 10,44 14 ? 3 WED"    三月的每週三的14:10和14:44觸發 
"0 15 10 ? * MON-FRI"    每個週一、週二、週三、週四、週五的10:15觸發 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章