在日常的業務場景中,我們經常需要讓系統在特定的時間去完成某項任務,比如每小時清理一次數據庫曆史數據、每隔5分鐘同步一次數據等等。Spring Task可以幫我們實現這些功能,不僅開箱即用、配置簡單,而且功能強大。一起來看下吧!
開始使用創建一個Spring Boot應用,使用@EnableScheduling注解開啟定時任務功能
@EnableScheduling
@SpringBootApplication
public class ScheduleDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleDemoApplication.class, args);
}
}
創建一個自定義的任務類,為方法添加@Scheduled注解
@Component
public class MyTask {
@Scheduled(fixedDelay = 2000)
public void work() {
System.out.println("Start working...");
}
}
本地運行程序,可以看到
每隔2秒鐘,控制台就會打印一次“Start working...”,這樣一個最簡單的定時任務就已經實現了。
@EnableScheduling這個注解用來開啟Spring的定時任務功能,開啟後應用就會自動檢測帶有@Scheduled注解的方法,按照制定的觸發規則進行方法的調用。如果添加了@EnableScheduling注解,就一定要去實現自定義的任務類(如上的MyTask類)。
@Scheduled在我們實現的自定義任務類中,必須包含一個@Scheduled注解的方法,如果沒有,程序會在啟動後立即異常退出
@Scheduled用來标注一個要定時運行的方法,它有三個常用的屬性
fixedDelay和fixedRate容易讓人搞混,這裡用一張圖來幫助你理解它們之間的差異
fixedDelay和fixedRate的默認時間單位是毫秒,可以通過timeUnit屬性進行設置
@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS)
public void work() {
System.out.println("Start working...");
}
@Scheduled還有兩個屬性,fixedDelayString和fixedRateString,它們支持通過占位符的方式來獲取application.yml中配置的屬性值
work:
fixedDelay: 2000
@Scheduled(fixedDelayString = "${work.fixedDelay}")
public void work() {
System.out.println("Start working...");
}
假如我們有如下的需求,周一到周五每天的12點進行數據的同步,使用fixedDelay和fixedRate是無法實現的,這裡就要用到cron表達式了
@Scheduled(cron="0 0 12 * * MON-FRI")
public void transferData() {
System.out.println("Start transferring data...");
}
cron表達式功能強大,使用簡單,我後面再出一期專門介紹cron表達式的文章吧,這裡不過多介紹了,也可以使用一些在線生成工具來生成表達式,也是很方便的。
Spring Task簡潔、易用、高效,可以滿足單機版定時任務的大部分需求。不過面對企業複雜的需求,它還是過于簡單了,這時就要用到quartz和xxl-job這種更加強大完善的框架了。下一篇我們将來深入分析quartz的集成使用,有問題可以在評論區交流下,歡迎點贊收藏關注。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!