重寫Spring Boot定時任務,支持可動態調整執行時間

Spring Boot應該是目前最火的java開源框架了,它簡化了我們創建一個web服務的過程,讓我們可以在很短時間、基本零配置就可以啟動一個web服務。

定時任務在我們平常的業務開發用的非常多,Spring Boot創建一個定時任務很簡單,只需要用@Scheduled註解方法,就可以讓方法按照定義的時間進行運行。但是,Spring Boot的@Scheduled默認是單線程的,也就是如果有兩個定時任務,那第二個定時必須在第一個定時任務執行完成之後才能開始執行。當然我們可以使用@Async讓方法異步,來達到多線程的目的。但是,今天我要講的是如何重寫Spring Boot定時任務,並可支持動態調整執行時間。

1、定義我們需要定時觸發的任務方法

重寫Spring Boot定時任務,支持可動態調整執行時間

實例代碼中我們定義了兩個需要進行定時觸發的任務。並且自定義註解@CronScheduled

2、自定義註解@CronScheduled

自定義註解的作用主要在於後續的邏輯可以獲取到該方法的執行週期。同時也可以定義其它的屬性,用於後續的業務邏輯處理

重寫Spring Boot定時任務,支持可動態調整執行時間

3、註冊定時任務

標題我們提出了支持可動態調整執行時間。平常的定時任務中我們沒法動態調整執行時間,除非重啟應用。那我們咋這裡怎麼動態調整時間呢?思路是:重新註冊任務。當我們檢測到定時任務的執行時間發生變化,我們就重新註冊任務。如果我們的定時任務表達式是配置在數據庫,那我們可以定時輪訓數據庫獲取,檢測到變化了就重新註冊。如果是配置在配種中心,配置中心一般會有觸發器trigger。當我們接受配置中心數據發生變化的通知以後,我們重新註冊定時任務。

重寫Spring Boot定時任務,支持可動態調整執行時間

重新註冊任務的方法

重寫Spring Boot定時任務,支持可動態調整執行時間

reReqiester方法可以暴露出去被其它類調用。當外部邏輯檢測到定時任務的執行時間發生變化,調用此方法重新註冊定時任務

ScheduledTaskRegistrar是Task的一個容器, 內部維護了這些Task List和executor的引用, 並負責將Task置入executor中執行。ScheduledTaskRegistrar的實現原理大家自行研究。這裡就不進行詳細解釋。

實現BeanPostProcessor可以在ScheduleTask對象實例化以後,我們調用自己的邏輯方法。在這裡我們用來觸發configureTasks方法。

重寫Spring Boot定時任務,支持可動態調整執行時間

至此,我們就自己實現了定時任務的調度,在調度的過程中,我們也可以加入自己邏輯處理業務。


分享到:


相關文章: