SpringBoot如何動(dòng)態(tài)修改Scheduled(系統(tǒng)啟動(dòng)默認(rèn)執(zhí)行,動(dòng)態(tài)修改)
SpringBoot 動(dòng)態(tài)修改Scheduled
場(chǎng)景:
可配置的 Scheduled 執(zhí)行時(shí)間,正常的 Scheduled 是在項(xiàng)目啟動(dòng)的時(shí)候固定死的,沒辦法根據(jù)調(diào)用后臺(tái)代碼自動(dòng)更新 Scheduled 執(zhí)行時(shí)間
例如:
系統(tǒng)啟動(dòng) 讀取時(shí)間 Cron : 0 0 3 * * ? ,通過(guò)執(zhí)行后臺(tái)方法 可以動(dòng)態(tài)配置 Cron 時(shí)間格式,并且清楚掉原本執(zhí)行任務(wù),執(zhí)行新的設(shè)置定時(shí)任務(wù)時(shí)間
1、根據(jù) ThreadPoolTaskScheduler 、ScheduledFuture 類 動(dòng)態(tài)修改定時(shí)任務(wù)(ThreadPoolTaskScheduler 這個(gè)類 不能使用@Autowired ,直接定義成員變量 )
private ThreadPoolTaskScheduler threadPoolTaskScheduler; private ScheduledFuture<?> future;
2、動(dòng)態(tài)修改 Scheduled 后臺(tái)方法邏輯(object 是 Runnable 實(shí)現(xiàn)類 需要執(zhí)行的定時(shí)邏輯,放到run 線程方法內(nèi))
threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
if(future!=null){
future.cancel(true);
}
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron時(shí)間格式字符串") );
以上邏輯 ----------------------- 就可以實(shí)現(xiàn) 動(dòng)態(tài) Scheduled 配置
以下邏輯 ----------------------- 配置項(xiàng)目啟動(dòng) 自動(dòng)讀取 DB Cron 設(shè)置定時(shí)
1、@Order 并實(shí)現(xiàn) CommandLineRunner 類 重寫方法 run
@Override
public void run(String... args) throws Exception {
logger.info("系統(tǒng)啟動(dòng) 默認(rèn)設(shè)置對(duì)賬任務(wù) 時(shí)間");
//獲取目前DB 設(shè)置的對(duì)賬時(shí)間
GetBillTimeResp time = systemConfigService.getTime();
//獲取Cron時(shí)間格式字符串
String timeCron = billTimeCronFormat(time.getBillTime());
logger.info("時(shí)間為:"+timeCron);
//Scheduler 設(shè)置每天執(zhí)行。。。
threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron時(shí)間格式字符串")); }
SpringBoot項(xiàng)目@Scheduled讀取動(dòng)態(tài)參數(shù)
1、基于@Scheduled可配置開發(fā)
application.propertites: read.timer.parmas=0 0/1 * * * *
定時(shí)類:
@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
@Scheduled(cron = "${read.timer.parmas}")
public void readConfigTable(){
logger.info("*****.read.timer.parmas");
}
}
啟動(dòng)類:
@SpringBootApplication
@EnableScheduling //必須
public class DataApplication {
public static void main(String[] args) {
SpringApplication.run(DataApplication.class,args);
}
}
2、基于代碼實(shí)現(xiàn)
(1)核心代碼
@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);
public static String DEFAULT_CORN="0/3 * * * * *";
//##動(dòng)態(tài)傳參要給默認(rèn)值。
public static String corn=DEFAULT_CORN;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
// logger.info("定時(shí)任務(wù)邏輯");
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//任務(wù)觸發(fā),可修改任務(wù)的執(zhí)行周期
CronTrigger cronTrigger = new CronTrigger(corn);
Date date = cronTrigger.nextExecutionTime(triggerContext);
return date;
}
});
}
}
(2)其他類或方法動(dòng)態(tài)傳參賦值
TestScheduledParams.corn="0/20 * * * * *"
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)
這篇文章通過(guò)圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis配置文件的局部背景顏色及mybatis 對(duì)應(yīng)的 xml 文件警告的方法圖解,需要的朋友可以參考下2018-09-09
Spring常用注解及自定義Filter的實(shí)現(xiàn)
這篇文章主要介紹了Spring常用注解及自定義Filter的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Mybatis的SqlRunner執(zhí)行流程實(shí)現(xiàn)
MyBatis提供了一個(gè)用于操作數(shù)據(jù)庫(kù)的SqlRunner工具類,對(duì)JDBC做了很好的封裝,本文主要介紹了Mybatis的SqlRunner執(zhí)行流程實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Java Collection和Collections的區(qū)別
本文主要介紹了Java Collection和Collections的區(qū)別,Collection?是表示集合的接口,而?Collections?是對(duì)集合進(jìn)行操作的工具類,下面就來(lái)介紹一下具體用法,感興趣的可以了解一下2023-12-12
SpringBoot+mybatis+thymeleaf實(shí)現(xiàn)登錄功能示例
這篇文章主要介紹了SpringBoot+mybatis+thymeleaf實(shí)現(xiàn)登錄功能示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Springboot項(xiàng)目實(shí)現(xiàn)將類從@ComponentScan中排除
這篇文章主要介紹了Springboot項(xiàng)目實(shí)現(xiàn)將類從@ComponentScan中排除,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
利用maven命令指定配置文件打包springboot項(xiàng)目
這篇文章主要介紹了利用maven命令指定配置文件打包springboot項(xiàng)目,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

