`

113. Spring Boot 定时任务升级篇(动态修改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 201746

 */

@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这个类有一个方法addTriggerTaskRunnable,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

 

下篇博客【Spring Boot 定时任务升级篇(动态添加修改删除定时任务)】

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

 

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics