SpringBoot如何动态修改Scheduled(系统启动默认执行|SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)
SpringBoot 动态修改Scheduled
场景:
可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间
例如:
【SpringBoot如何动态修改Scheduled(系统启动默认执行|SpringBoot如何动态修改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
@Overridepublic 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 staticString DEFAULT_CORN="0/3 * * * * *"; //##动态传参要给默认值。public static String corn=DEFAULT_CORN; @Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(new Runnable() {@Overridepublic void run() {// logger.info("定时任务逻辑"); }}, new Trigger() {@Overridepublic Date nextExecutionTime(TriggerContext triggerContext) {//任务触发,可修改任务的执行周期CronTrigger cronTrigger = new CronTrigger(corn); Date date = cronTrigger.nextExecutionTime(triggerContext); return date; }}); }}
(2)其他类或方法动态传参赋值
TestScheduledParams.corn="0/20 * * * * *"
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- Activiti(一)SpringBoot2集成Activiti6
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- java中如何实现重建二叉树