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

Python定時任務(wù)的實現(xiàn)方式
說說Spring定時任務(wù)如何大規(guī)模企業(yè)級運用
解析Golang定時任務(wù)庫gron設(shè)計和原理
求一種SpringBoot定時任務(wù)動態(tài)管理通用解決方案
Spring Boot中整合兩種定時任務(wù)的方法

在Spring Boot中如何使用定時任務(wù)
如何動態(tài)添加修改刪除定時任務(wù)?
Linux如何使用cron進行定時任務(wù)的操作
python定時任務(wù)實踐

評論