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

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

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

linux定時(shí)任務(wù)的用法總結(jié)

評論