tft每日頭條

 > 圖文

 > spring定時執行

spring定時執行

圖文 更新时间:2024-10-12 08:49:48

在日常的業務場景中,我們經常需要讓系統在特定的時間去完成某項任務,比如每小時清理一次數據庫曆史數據、每隔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..."); } }

本地運行程序,可以看到

spring定時執行(你不知道的Spring定時任務)1

每隔2秒鐘,控制台就會打印一次“Start working...”,這樣一個最簡單的定時任務就已經實現了。

@EnableScheduling

這個注解用來開啟Spring的定時任務功能,開啟後應用就會自動檢測帶有@Scheduled注解的方法,按照制定的觸發規則進行方法的調用。如果添加了@EnableScheduling注解,就一定要去實現自定義的任務類(如上的MyTask類)。

@Scheduled

在我們實現的自定義任務類中,必須包含一個@Scheduled注解的方法,如果沒有,程序會在啟動後立即異常退出

spring定時執行(你不知道的Spring定時任務)2

@Scheduled用來标注一個要定時運行的方法,它有三個常用的屬性

  • fixedDelay:固定的時間間隔,單位毫秒,從上次執行結束下次開始執行之間的時間間隔
  • fixedRate:固定的時間頻率,單位毫秒,從上次開始執行下次開始執行之間的時間間隔
  • cron:使用cron表達式來描述更複雜的定時運行規則

fixedDelayfixedRate容易讓人搞混,這裡用一張圖來幫助你理解它們之間的差異

spring定時執行(你不知道的Spring定時任務)3

fixedDelayfixedRate的默認時間單位是毫秒,可以通過timeUnit屬性進行設置

@Scheduled(fixedDelay = 1, timeUnit = TimeUnit.SECONDS) public void work() { System.out.println("Start working..."); }

@Scheduled還有兩個屬性,fixedDelayStringfixedRateString,它們支持通過占位符的方式來獲取application.yml中配置的屬性值

work: fixedDelay: 2000

@Scheduled(fixedDelayString = "${work.fixedDelay}") public void work() { System.out.println("Start working..."); }

假如我們有如下的需求,周一到周五每天的12點進行數據的同步,使用fixedDelayfixedRate是無法實現的,這裡就要用到cron表達式

@Scheduled(cron="0 0 12 * * MON-FRI") public void transferData() { System.out.println("Start transferring data..."); }

cron表達式功能強大,使用簡單,我後面再出一期專門介紹cron表達式的文章吧,這裡不過多介紹了,也可以使用一些在線生成工具來生成表達式,也是很方便的。

Spring Task簡潔、易用、高效,可以滿足單機版定時任務的大部分需求。不過面對企業複雜的需求,它還是過于簡單了,這時就要用到quartzxxl-job這種更加強大完善的框架了。下一篇我們将來深入分析quartz的集成使用,有問題可以在評論區交流下,歡迎點贊收藏關注。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved