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

猜你喜欢

转载自www.cnblogs.com/zt007/p/8949996.html
今日推荐