2. Spring Boot 定時任務升級篇(動態修改cron引數)
【文章出自:http://412887952-qq-com.iteye.com/blog/2367537】
需求緣起:在釋出了《Spring Boot定時任務升級篇》之後得到不少反饋,其中有一個反饋就是如何動態修改cron引數呢?那麼我們一起看看具體怎麼實現,先看下本節大綱:
(1)簡單方式:修改定時任務的執行週期;(2)動態修改定時任務的執行週期;
接下來看下本節的具體內容:
(1)簡單方式:修改定時任務的執行週期;
按正常來講,修改定時任務的執行週期,把服務停下來,改下任務的cron引數,再重啟服務就搞搞定了。這種方式很簡單,沒有可說的,但是有沒有一種可能,在不停服務的情況下,就可以動態的修改任務的cron引數呢?哈哈,那是必須的必。
(2)動態修改定時任務的執行週期;
首先我們先會回顧下,我們之前是使用了@Scheduled(cron =“0/5 * * * * *”)這種方式適用於固定任務週期的任務,若要修改任務執行週期,只能走“停服務—修改任務執行週期—重啟服務”這條路。那麼如何動態修改呢,我們看下步驟:
① 在定時任務類上增加@EnabledScheduling註解,並實現SchedulingConfigurer介面。② 設定一個靜態的cron,用於存放任務執行週期引數。
③ 開啟一個執行緒,用於模擬實際業務中外部原因修改了任務執行週期。
④ 設定任務觸發器,觸發任務執行。
具體的程式碼如下:
package
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