场景:可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间
例如:系统启动 读取时间 Cron : 0 0 3 * * ? ,通过执行后台方法 可以动态配置 Cron 时间格式,并且清楚掉原本执行任务,执行新的设置定时任务时间
1、根据 ThreadPoolTaskScheduler 、ScheduledFuture 类 动态修改定时任务(ThreadPoolTaskScheduler 这个类 不能使用@Autowired ,直接定义成员变量 )
1private ThreadPoolTaskScheduler threadPoolTaskScheduler; 2 private ScheduledFuture<?> future;
2、动态修改 Scheduled 后台方法逻辑(object 是 Runnable 实现类 需要执行的定时逻辑,放到run 线程方法内)
1threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); 2 threadPoolTaskScheduler.initialize(); 3 if(future!=null){ 4 future.cancel(true); 5 } 6 future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );
以上逻辑 ----------------------- 就可以实现 动态 Scheduled 配置
以下逻辑 ----------------------- 配置项目启动 自动读取 DB Cron 设置定时
1、@Order 并实现 CommandLineRunner 类 重写方法 run
1 @Override 2 public void run(String... args) throws Exception { 3 logger.info("系统启动 默认设置对账任务 时间"); 4 //获取目前DB 设置的对账时间 5 GetBillTimeResp time = systemConfigService.getTime(); 6 //获取Cron时间格式字符串 7 String timeCron = billTimeCronFormat(time.getBillTime()); 8 logger.info("时间为:"+timeCron); 9 //Scheduler 设置每天执行。。。 10 threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); 11 threadPoolTaskScheduler.initialize(); 12 future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }