113. Spring Boot 定时任务升级篇(动态修改cron参数)

 

【视频 & 交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

【本篇博客,有配套视频,视频地址:《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 定时任务升级篇(动态添加修改删除定时任务)】

视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

猜你喜欢

转载自412887952-qq-com.iteye.com/blog/2367537