可設定的Scheduled 執行時間,正常的Scheduled 是在專案啟動的時候固定死的,沒辦法根據呼叫後台程式碼自動更新Scheduled執行時間
系統啟動讀取時間Cron : 0 0 3 * * ? ,透過執行後台方法可以動態配置Cron 時間格式,並且清楚掉原本執行任務,執行新的設定定時任務時間
1、根據ThreadPoolTaskScheduler 、ScheduledFuture 類別動態修改定時任務(ThreadPoolTaskScheduler 這個類別不能使用@Autowired ,直接定義成員變數)
private ThreadPoolTaskScheduler threadPoolTaskScheduler; private ScheduledFuture<?> future;
#2、動態修改Scheduled 後台方法邏輯(object 是Runnable 實作類別需要執行的定時邏輯,放到run 執行緒方法內)
threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.initialize(); if(future!=null){ future.cancel(true); } future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );
以上邏輯------------------ ----- 就可以實現動態Scheduled 配置
以下邏輯----------------------- 配置項目啟動自動讀取DB Cron 設定定時
1、@Order 並實作CommandLineRunner 類別重寫方法run
@Override public void run(String... args) throws Exception { logger.info("系统启动 默认设置对账任务 时间"); //获取目前DB 设置的对账时间 GetBillTimeResp time = systemConfigService.getTime(); //获取Cron时间格式字符串 String timeCron = billTimeCronFormat(time.getBillTime()); logger.info("时间为:"+timeCron); //Scheduler 设置每天执行。。。 threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.initialize(); future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }
application.propertites: read.timer.parmas=0 0/1 * * * *
定時類別:
@Component public class ScheduledService { Logger logger= LoggerFactory.getLogger(ScheduledService.class); @Scheduled(cron = "${read.timer.parmas}") public void readConfigTable(){ logger.info("*****.read.timer.parmas"); } }
啟動類別:
@SpringBootApplication @EnableScheduling //必须 public class DataApplication { public static void main(String[] args) { SpringApplication.run(DataApplication.class,args); } }
(1)核心代碼
@Component @EnableScheduling public class TestScheduledParams implements SchedulingConfigurer{ Logger logger= LoggerFactory.getLogger(TestScheduledParams.class); public static String DEFAULT_CORN="0/3 * * * * *"; //##动态传参要给默认值。 public static String corn=DEFAULT_CORN; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() { // logger.info("定时任务逻辑"); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任务触发,可修改任务的执行周期 CronTrigger cronTrigger = new CronTrigger(corn); Date date = cronTrigger.nextExecutionTime(triggerContext); return date; } }); } }
(2)其他類別或方法動態傳參賦值
TestScheduledParams.corn="0/20 * * * * *"
以上是SpringBoot怎麼動態修改Scheduled的詳細內容。更多資訊請關注PHP中文網其他相關文章!