如何動態修改cron參數呢?那么我們一起看看具體怎么實現,先看下本節大綱:
(1)簡單方式:修改定時任務的執行周期;
(2)動態修改定時任務的執行周期;
接下來看下本節的具體內容:
(1)簡單方式:修改定時任務的執行周期;
按正常來講,修改定時任務的執行周期,把服務停下來,改下任務的cron參數,再重啟服務就搞搞定了。這種方式很簡單,沒有可說的,但是有沒有一種可能,在不停服務的情況下,就可以動態的修改任務的cron參數呢?哈哈,那是必須的必。
(2)動態修改定時任務的執行周期;
首先我們先會回顧下,我們之前是使用了@Scheduled(cron =“0/5 * * * * *”)這種方式適用于固定任務周期的任務,若要修改任務執行周期,只能走“停服務—修改任務執行周期—重啟服務”這條路。那么如何動態修改呢,我們看下步驟:
① 在定時任務類上增加@EnabledScheduling注解,并實現SchedulingConfigurer接口。
② 設置一個靜態的cron,用于存放任務執行周期參數。
③ 開啟一個線程,用于模擬實際業務中外部原因修改了任務執行周期。
④ 設置任務觸發器,觸發任務執行。
具體的代碼如下:
package com.kfit.task;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
importorg.springframework.scheduling.annotation.EnableScheduling;
importorg.springframework.scheduling.annotation.SchedulingConfigurer;
importorg.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("TaskCronChangetask 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 0605:38:20 CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:25CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:30CST 2017
cronchange to:0/10 * * * * *
TaskCronChangetask is running ... Thu Apr 06 05:38:35CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:40CST 2017
TaskCronChangetask is running ... Thu Apr 06 05:38:50CST 2017
-
JAVA
+關注
關注
19文章
2974瀏覽量
104984 -
服務
+關注
關注
0文章
75瀏覽量
18521
發布評論請先 登錄
相關推薦
評論