zoukankan      html  css  js  c++  java
  • SpringBoot 定时任务升级篇(动态修改cron参数)

    需求缘起:在发布了《Spring Boot定时任务升级篇》之后得到不少反馈,其中有一个反馈就是如何动态修改cron参数呢?那么我们一起看看具体怎么实现,先看下本节大纲:

    1)简单方式:修改定时任务的执行周期;
    (2)动态修改定时任务的执行周期; 

    接下来看下本节的具体内容:

    (1)简单方式:修改定时任务的执行周期;

           按正常来讲,修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?哈哈,那是必须的必。

     

    (2)动态修改定时任务的执行周期;

           首先我们先会回顾下,我们之前是使用了@Scheduled(cron =“0/5 * * * * *”)这种方式适用于固定任务周期的任务,若要修改任务执行周期,只能走“停服务—修改任务执行周期—重启服务”这条路。

    那么如何动态修改呢,我们看下步骤:

    ① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
    ② 设置一个静态的cron,用于存放任务执行周期参数。
    ③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。
    ④ 设置任务触发器,触发任务执行。 

    具体的代码如下:

    package com.kfit.task;
    
    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;
    
     
    
    /**
    
     * Spring @Scheduled定时任务动态修改cron参数
    
     * @author Angel --守护天使
    
     * @version v.0.1
    
     * @date 2017年4月6日
    
     */
    
    @Component 
    
    @EnableScheduling
    
    public class TaskCronChange implements  SchedulingConfigurer{
    
        public static String cron; 
      
        public TaskCronChange() {
    
            //默认情况是:每5秒执行一次.
            cron = "0/5 * * * * *";
    
            new Thread(new Runnable() {          
    
               // 开启新线程模拟外部更改了任务执行周期.
               @Override
               public void run() {
                  try {
                      // 让线程睡眠 15秒.
                      Thread.sleep(15000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                   //修改为:每10秒执行一次.
                  cron = "0/10 * * * * *";
                   System.err.println("cron change to:"+cron);
               }
    
           }).start();;
        }     
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
           Runnable task = new Runnable() {
    
               @Override
    
               public void run() {
                  //任务逻辑代码部分.
                  System.out.println("TaskCronChange task is running ... "+ new Date());
               }
    
           };
    
           Trigger trigger = new Trigger() {
    
               @Override
               public Date nextExecutionTime(TriggerContext triggerContext) {
    
                  //任务触发,可修改任务的执行周期.
                  CronTrigger trigger = new CronTrigger(cron);
                  Date nextExec = trigger.nextExecutionTime(triggerContext);
                  return nextExec;
               }
           };
           taskRegistrar.addTriggerTask(task, trigger);
        }
    }

    这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。

           启动查看控制台的打印信息如下:

    TaskCronChange task is running ... Thu Apr 06 05:38:20 CST 2017

    TaskCronChange task is running ... Thu Apr 06 05:38:25 CST 2017

    TaskCronChange task is running ... Thu Apr 06 05:38:30 CST 2017

    cron change to:0/10 * * * * *

    TaskCronChange task is running ... Thu Apr 06 05:38:35 CST 2017

    TaskCronChange task is running ... Thu Apr 06 05:38:40 CST 2017

    TaskCronChange task is running ... Thu Apr 06 05:38:50 CST 2017

     

    转自:http://412887952-qq-com.iteye.com/blog/2367537

  • 相关阅读:
    aspscheduler+uwsgi定时任务执行多次
    django定时任务
    django记录用户操作模块
    python缩小图片
    pymysql同时执行多条语句时报错
    MySQL8.0 修改密码
    linux中安装python3
    Mysql高性能
    Mysql高性能
    Mysql高性能
  • 原文地址:https://www.cnblogs.com/zt007/p/8949996.html
Copyright © 2011-2022 走看看