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

Spring Boot定時任務的重寫方法
評論