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觸發