原文地址:http://te-amo.site/user/article/info/ARTICLE20180227033124070
寫在前面的
在實際開發中定時任務的執行計劃都不是固定的,根據不同的實際情況會指定不同的任務開啓時間,停止時間,以及執行頻率,所以動態的管理定時任務是一種實際開發中常見的設計。
一、動態管理定時任務說明
使用Quartz來實現定時任務的管理是比較簡單的,但是本次我們將使用Spring提供ThreadPoolTaskScheduler來實現,由於現在還未對Quartz深入學習,所以對Quartz不做過多解釋。
ThreadPoolTaskScheduler是TaskScheduler接口的默認實現類,能夠開啓線程池進行任務調度,支持設置線程數,默認爲單線程。
ThreadPoolTaskScheduler 通過schedule方法,添加定時任務和觸發器後,會得到一個ScheduledFuture
二、使用ThreadPoolTaskScheduler實現定時任務管理
示例代碼如下:
@Component
public class DynamicTask {
private static Logger logger = Logger.getLogger(DynamicTask.class.getName());
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> task;
//採用注入的方式創建ThreadPoolTaskScheduler
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
//任務開始
public void startTask() {
task = threadPoolTaskScheduler.schedule(new Runnable() {
@Override
public void run() {
logger.info(new Date()+"0/2 * * * * *");
}
}, new CronTrigger("0/2 * * * * *"));
logger.info("開始任務!");
}
//任務停止
public String stopTask() {
if (task != null) {
task.cancel(true);
}
logger.info("任務停止!");
return "stopCron";
}
//更改計劃,可以將更改的執行計劃作爲參數傳入
public void changePlan() {
stopTask();
task = threadPoolTaskScheduler.schedule(new Runnable() {
@Override
public void run() {
logger.info(new Date()+"*/5 * * * * *");
}
}, new CronTrigger("*/5 * * * * *"));
logger.info("改變任務!");
}
}
以上代碼只是一個簡單的示例,更多的應用,大家根據實際情況來設計