您的位置:首页技术文章
文章详情页

SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)

浏览:8日期:2023-02-27 08:01:52
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时间格式字符串') );

以上逻辑 ----------------------- 就可以实现 动态 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时间格式字符串')); }SpringBoot项目@Scheduled读取动态参数1、基于@Scheduled可配置开发

application.propertites: read.timer.parmas=0 0/1 * * * *

定时类:

@Componentpublic 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); }}2、基于代码实现

(1)核心代码

@Component@EnableSchedulingpublic 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 * * * * *'

以上为个人经验,希望能给大家一个参考,也希望大家多多支持好吧啦网。

标签: Spring