java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

關於spring boot 實現任務調度的方法有很多種,這裡不再贅述。

首先pom只需引入

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

然後application開啟@EnableScheduling

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

之後用嘛就很簡單了

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

========分隔線=========

首先大致說下遇到過的問題

Q1:啟動後修改本地時間但是調度任務不再執行

A:之前大致看了一下這塊的介紹,其實啟動之後虛擬機內維持一個時間計數器,這個是啟動時與系統時間同步過的,當讓會有一個專門管理調度任務的,按照虛擬機時間以及系統時間核對(如果這出現不一致肯定不執行了),如果一致那麼也滿足cron規則就開啟執行。

Q2:出現漏執行的情況

A:我目前瞭解到其實spring的@Scheduled默認是單線程的,也就是說一次只能執行一個定時任務,如果一但任務是耗時的那麼後面的自動進入線程的掛起等待隊列,當然這個隊列也是有大小限制,如果執行中任務特別耗時掛起的超過限制那麼後面的任務都不會執行。

很多大企是很注重調度任務的可用性,因為畢竟對於任務調度這個事情來說裡面涉及到的業務肯定都是有價值甚至很重要的。特別公司發展的一定程度調度任務的重要性非常的高。所以如果還是單節點的架構的調度的話建議還是上高可用的調度吧,那麼關於高可用的調度任務網上還是有好幾個解決方案以供選擇,其實最核心的一點哪怕是多節點調度也是單一機器去執行調度任務,也就要求做到分佈式鎖,一般來講redis 或者 zookeeper就可以很好的實現這塊。當然還有一個很重要的事兒就是關於調度任務失敗的重調。個人推薦elastic-job這個組件,可以自行研究對比後選擇適合自己公司業務的。

針對以上調度線程是單線程問題其實也可以通過,設置執行線程數目,建議開啟的線程池核心線程不要過高,畢竟cpu也就那麼多個核心,線上項目又肯定不是自己一個的。何況還有維護系統其他組件等的線程。個人感覺視自己項目裡調度數量和執行時間決定。單一時間段內不會出現跑滿即可。

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

當然針對耗時較長的調度任務其實完成可以這樣解決:加上 @Async

spring會把這個方法另開啟一個線程去處理,以達到異步處理的效果,這樣調度任務也會快速。當然沒必要給所有調度都這麼加。

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄

好了 大致就是以上的幾點,基本也就滿足中小企業遇到的調度問題。當然也可能有描述不準確或者不全面的地方,歡迎指正,哈哈。

java—springboot使用Scheduled註解實現任務調度及相關踩坑記錄


分享到:


相關文章: