SpringBoot如何动态修改Scheduled(系统启动默认执⾏,
动态修改)
SpringBoot 动态修改Scheduled
场景:
可配置的 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时间格式字符串") );
spring framework runtime以上逻辑 ----------------------- 就可以实现动态 Scheduled 配置
以下逻辑 ----------------------- 配置项⽬启动⾃动读取 DB Cron 设置定时
1、@Order 并实现 CommandLineRunner 类重写⽅法 run
@Override
public void args) throws Exception {
logger.info("系统启动默认设置对账任务时间");
//获取⽬前DB 设置的对账时间
GetBillTimeResp time = Time();
//获取Cron时间格式字符串
String timeCron = BillTime());
logger.info("时间为:"+timeCron);
//Scheduler 设置每天执⾏。。。
threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }
SpringBoot项⽬@Scheduled读取动态参数
1、基于@Scheduled可配置开发
application.propertites:
read.timer.parmas=0 0/1 * * * *
定时类:
@Component
public class ScheduledService {
Logger logger= Logger(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);
}
}
2、基于代码实现
(1)核⼼代码
@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
Logger logger= Logger(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 = ExecutionTime(triggerContext);
return date;
}
});
}
}
(2)其他类或⽅法动态传参赋值
<="0/20 * * * * *"
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。