Spring Boot應該是目前最火的java開源框架了,它簡化了我們創建一個web服務的過程,讓我們可以在很短時間、基本零配置就可以啟動一個web服務。
定時任務在我們平常的業務開發用的非常多,Spring Boot創建一個定時任務很簡單,只需要用@Scheduled注解方法,就可以讓方法按照定義的時間進行運行。但是,Spring Boot的@Scheduled默認是單線程的,也就是如果有兩個定時任務,那第二個定時必須在第一個定時任務執行完成之后才能開始執行。當然我們可以使用@Async讓方法異步,來達到多線程的目的。但是,今天我要講的是如何重寫Spring Boot定時任務,并可支持動態調整執行時間。
1、定義我們需要定時觸發的任務方法
實例代碼中我們定義了兩個需要進行定時觸發的任務。并且自定義注解@CronScheduled
2、自定義注解@CronScheduled
自定義注解的作用主要在于后續的邏輯可以獲取到該方法的執行周期。同時也可以定義其它的屬性,用于后續的業務邏輯處理
3、注冊定時任務
標題我們提出了支持可動態調整執行時間。平常的定時任務中我們沒法動態調整執行時間,除非重啟應用。那我們咋這里怎么動態調整時間呢?思路是:重新注冊任務。當我們檢測到定時任務的執行時間發生變化,我們就重新注冊任務。如果我們的定時任務表達式是配置在數據庫,那我們可以定時輪訓數據庫獲取,檢測到變化了就重新注冊。如果是配置在配種中心,配置中心一般會有觸發器trigger。當我們接受配置中心數據發生變化的通知以后,我們重新注冊定時任務。
重新注冊任務的方法
reReqiester方法可以暴露出去被其它類調用。當外部邏輯檢測到定時任務的執行時間發生變化,調用此方法重新注冊定時任務
ScheduledTaskRegistrar是Task的一個容器, 內部維護了這些Task List和executor的引用, 并負責將Task置入executor中執行。ScheduledTaskRegistrar的實現原理大家自行研究。這里就不進行詳細解釋。
實現BeanPostProcessor可以在ScheduleTask對象實例化以后,我們調用自己的邏輯方法。在這里我們用來觸發configureTasks方法。
至此,我們就自己實現了定時任務的調度,在調度的過程中,我們也可以加入自己邏輯處理業務。
-
Web
+關注
關注
2文章
1263瀏覽量
69503 -
JAVA
+關注
關注
19文章
2969瀏覽量
104779
發布評論請先 登錄
相關推薦
評論