SpringBoot 定時任務 @Scheduled
前言
有時候,我們有這樣的需求,需要在每天的某個固定時間或者每隔一段時間讓應用去執行某一個任務。一般情況下,可以使用多線程來實現這個功能;在 Spring 框架下可以搭配 Quartz 來實現,附上筆記 Spring Quartz 實現多任務定時調用。在 SpringBoot 框架下,我們可以用 Spring scheduling 來實現定時任務功能。
首先,我們先創建一個 Spring Boot 項目。創建方法:
* (自動完成初始化)http://blog.csdn.net/u011244202/article/details/54767036
* (手動完成初始化)http://blog.csdn.net/u011244202/article/details/54604421
同時要注意,SpringBoot 項目需要 JDK8 的編譯環境!
然后,在項目主類中加入@EnableScheduling注解,啟用定時任務的配置
@SpringBootApplication
@EnableScheduling
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
最后,創建定時任務實現類,注意加上注解@Scheduled
@Scheduled 的介紹
1. cron 表達式與 zone
zone:表示將解析cron表達式的時區。
關於 cron 表達式,可以參考一下 http://blog.csdn.net/u011244202/article/details/54382466 里面的附錄。
2. fixedRate 的解釋
調用固定周期(以毫秒為單位)執行方法。就是上一次開始執行時間點之后延遲執行。
3. fixedDelay 的解釋
上次調用結束和下一次調用結束之間的固定周期(以毫秒為單位)執行方法。就是上一次執行完畢時間點之后延遲執行。
4. initialDelay 的解釋
在第一次執行fixedRate()或fixedDelay()任務之前延遲(以毫秒為單位)。
實例
在項目啟動 8s 后,每隔 5s 調用定時任務。
@Component
public class ScheduledTasks {
//輸出時間格式
private static final SimpleDateFormat format = new SimpleDateFormat("HH(hh):mm:ss S");
@Scheduled(initialDelay = 5000, fixedRate = 5000)
public void firstScheduledTasks(){
System.out.println("定時任務執行,現在時間是 : "+format.format(new Date()));
}
}
結果圖:

項目參考地址
項目參考地址 : https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B4
注意:
cron、fixedDelay、fixedRate 三者之間不能共存!!!
會拋出一個錯誤:
//Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'firstScheduledTasks': Exactly one of the 'cron', 'fixedDelay(String)', or 'fixedRate(String)' attributes is required.
官方文檔
實例文檔 : http://spring.io/guides/gs/scheduling-tasks/
注解文檔 : http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Scheduled.html
