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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM