SpringBoot 动态修改Scheduled
场景:
可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间
例如:
系统启动 读取时间 Cron : 0 0 3 * * ? ,通过执行后台方法 可以动态配置 Cron 时间格式,并且清楚掉原本执行任务,执行新的设置定时任务时间
1、根据 ThreadPoolTaskScheduler 、ScheduledFuture 类 动态修改定时任务(ThreadPoolTaskScheduler 这个类 不能使用@Autowired ,直接定义成员变量 )
1
2
|
private ThreadPoolTaskScheduler threadPoolTaskScheduler; private ScheduledFuture<?> future; |
2、动态修改 Scheduled 后台方法逻辑(object 是 Runnable 实现类 需要执行的定时逻辑,放到run 线程方法内)
1
2
3
4
5
6
|
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
1
2
3
4
5
6
7
8
9
10
11
12
|
@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时间格式字符串" )); } |
SpringBoot项目@Scheduled读取动态参数
1、基于@Scheduled可配置开发
1
2
|
application.propertites: read.timer.parmas= 0 0 / 1 * * * * |
定时类:
1
2
3
4
5
6
7
8
|
@Component public class ScheduledService { Logger logger= LoggerFactory.getLogger(ScheduledService. class ); @Scheduled (cron = "${read.timer.parmas}" ) public void readConfigTable(){ logger.info( "*****.read.timer.parmas" ); } } |
启动类:
1
2
3
4
5
6
7
|
@SpringBootApplication @EnableScheduling //必须 public class DataApplication { public static void main(String[] args) { SpringApplication.run(DataApplication. class ,args); } } |
2、基于代码实现
(1)核心代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@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)其他类或方法动态传参赋值
1
|
TestScheduledParams.corn= "0/20 * * * * *" |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/yi1036943655/p/11511676.html