• Springboot定时任务实现动态配置Cron参数(从外部数据库获取)


    https://blog.csdn.net/qq_35992900/article/details/80429245

    我们主要讲解它的动态配置使用方法。
    
    在刚开始使用的时候,我们更改一个任务的执行时间,一般是这样的:修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?那是必须有! 
    刚刚提到的方法里,我们在主类上面加@EnableScheduling注解,在任务方法前面加上@Scheduled(cron =“0/5 * * * * *”)注解定义执行时间,但是动态配置的步骤就有点不一样: 
    
    1. 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。 
    2. 设置一个静态的cron,用于存放任务执行周期参数。 
    3. 从数据库获取Cron参数,用于模拟实际业务中外部原因修改了任务执行周期。 
    4. 设置任务触发器,触发任务执行。
    ————————————————
    

      

    import java.util.Date;
    
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
    import java.time.LocalDateTime;
    
    @Component 
    @EnableScheduling
    public class TaskCronChange implements  SchedulingConfigurer{
    
        public static String cron; 
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            //项目部署时,会在这里执行一次,从数据库拿到cron表达式
            cron = timerQueryMapper.getCronTime();
    
           Runnable task = new Runnable() {
               @Override
               public void run() {
                  //任务逻辑代码部分.
                  System.out.println("I am going:" + LocalDateTime.now());
               }
           };
           Trigger trigger = new Trigger() {
               @Override
               public Date nextExecutionTime(TriggerContext triggerContext) {
                  //任务触发,可修改任务的执行周期.
                  //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间        
                  cron = timerQueryMapper.getCronTime();
                  CronTrigger trigger = new CronTrigger(cron);
                  Date nextExec = trigger.nextExecutionTime(triggerContext);
                  return nextExec;
               }
           };
           taskRegistrar.addTriggerTask(task, trigger);
        }
    
    }
    

      

    因为是要任务执行一次的时候才会去修改时间的cron表达式,所以改了cron后,要在下下次任务执行时才会生效。
    这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。

  • 相关阅读:
    设计模式 ( 十七) 状态模式State(对象行为型)
    Intellij13 IDEA常用快捷键 (mac 10.5 +),优化,使用出现的问题汇总
    Web服务器及Web应用服务器
    阮一峰的网络日志
    双击退出的实现
    完成3DM以后的总结(2).Xutils的简单使用
    完成3DM以后的总结(1).PullToRefresh
    软考之路之j2se总结
    2013-2014年终总结
    牛腩新闻发布系统之获取IP
  • 原文地址:https://www.cnblogs.com/Andrew520/p/11714560.html
Copyright © 2020-2023  润新知