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

 更新时间:2021年07月07日 10:30:31   作者:Architect剑  
这篇文章主要介绍了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时间格式字符串") );

以上逻辑 ----------------------- 就可以实现 动态 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 * * * *

定时类:

@Component
public 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
@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)其他类或方法动态传参赋值

TestScheduledParams.corn="0/20 * * * * *"

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java源码解析Integer方法解读

    Java源码解析Integer方法解读

    这篇文章主要介绍了Java源码解析Integer方法解读,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • java 交换两个数据的方法实例详解

    java 交换两个数据的方法实例详解

    这篇文章主要介绍了java 交换两个数据的方法实例详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • mybatis之批量添加问题

    mybatis之批量添加问题

    这篇文章主要介绍了mybatis之批量添加问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MyBatis验证多级缓存及 Cache Aside 模式的应用小结

    MyBatis验证多级缓存及 Cache Aside 模式的应用小结

    本文介绍了MyBatis的多级缓存机制,包括本地缓存和全局缓存,并通过Spock测试框架验证了多级缓存的实现,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • java基础理论Stream的Filter与谓词逻辑

    java基础理论Stream的Filter与谓词逻辑

    这篇文章主要为大家介绍了java基础理论Stream的Filter与谓词逻辑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • java实现图形卡片排序游戏

    java实现图形卡片排序游戏

    这篇文章主要为大家详细介绍了java实现图形卡片排序游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Spring Cloud Gateway去掉url前缀

    Spring Cloud Gateway去掉url前缀

    这篇文章主要介绍了Spring Cloud Gateway去掉url前缀的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java之Swagger配置扫描接口以及开关案例讲解

    Java之Swagger配置扫描接口以及开关案例讲解

    这篇文章主要介绍了Java之Swagger配置扫描接口以及开关案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java高并发之CyclicBarrier的用法详解

    Java高并发之CyclicBarrier的用法详解

    CyclicBarrier 是 Java 中的一种同步工具,它可以让多个线程在一个屏障点处等待,直到所有线程都到达该点后,才能继续执行。本文就来和大家聊聊它的用法,需要的可以参考一下
    2023-03-03
  • idea创建spring boot工程及配置文件(最新推荐)

    idea创建spring boot工程及配置文件(最新推荐)

    本文给大家介绍idea创建spring boot工程及配置文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11

最新评论