SpringBoot2.0實戰(32)配置定時任務

SpringBoot2.0實戰(32)配置定時任務


定時任務的幾種實現方式:

  • Timer:Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少。
  • Quartz:使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜。
  • Spring Task:Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。

目標

在 SpringBoot 項目實現每秒打印一次當前時間

實戰

第一步:添加依賴

引入 Spring Boot Starter 父工程

SpringBoot2.0實戰(32)配置定時任務

添加 spring-boot-starter-web 的依賴,添加後的整體依賴如下

SpringBoot2.0實戰(32)配置定時任務

第二步:編寫啟動類

SpringBoot2.0實戰(32)配置定時任務

第三步:編寫定時任務調度類

  • 通過 @EnableScheduling 註解,開啟定時任務調度功能
  • 通過 @Scheduled 註解在需要執行的方法上,使用 cronExpression 表達式定義定時任務的執行策略

文章最後會詳細講解 cronExpression 表達式

SpringBoot2.0實戰(32)配置定時任務

第四步:驗證

啟動項目,查看日誌

<code>time : 07:23:45
time : 07:23:46
time : 07:23:47
time : 07:23:48
time : 07:23:49/<code>

源碼地址

本章源碼 : https://gitee.com/gongm_24/spring-boot-tutorial.git


擴展

cronExpression 表達式

表達式結構

<code>秒 分鐘 小時 日期 月份 星期 年/<code>

配置說明

SpringBoot2.0實戰(32)配置定時任務

特殊字符說明:

  • 星號(*)

可用在所有字段下,表示對應時間域名的每一個時刻,如*用在分鐘字段,表示“每分鐘”。

  • 問號(?)

只能用在日期和星期字段,代表無意義的值,比如使用L設定為當月的最後一天,則配置日期配置就沒有意義了,可用?作佔位符的作用。

  • 減號(-)

表示一個範圍,如在日期字段5-10,表示從五號到10號,相當於使用逗號的5,6,7,8,9,10

  • 逗號(,)

表示一個並列有效值,比如在月份字段使用JAN,DEC表示1月和12月

  • 斜槓(/)

x/y表示一個等步長序列,x為起始值,y為增量步長值,如在小時使用1/3相當於1,4,7,10當時用*/y時,相當於0/y

  • L

L(Last)只能在日期和星期字段使用,但意思不同。在日期字段,表示當月最後一天,在星期字段,表示星期六(如果按星期天為一星期的第一天的概念,星期六就是最後一天。如果L在星期字段,且前面有一個整數值X,表示“這個月的最後一個星期X”,比如3L表示某個月的最後一個星期二。

  • W

選擇離給定日期最近的工作日(週一至週五)。例如你指定“15W”作為day of month字段的值,就意味著“每個月與15號最近的工作日”。所以,如果15號是週六,則觸發器會在14號(週五)觸發。如果15號是週日,則觸發器會在16號(週一)觸發。如果15號是週二,則觸發器會在15號(週二)觸發。但是,如果你指定“1W”作為day of month字段的值,且1號是週六,則觸發器會在3號(週一)觸發。quartz不會“跳出”月份的界限。

  • LW組合

在日期字段可以組合使用LW,表示當月最後一個工作日(週一至週五)

  • 井號(#)

只能在星期字段中使用指定每月第幾個星期X。例如day of week字段的“6#3”,就意味著“每月第3個星期五”(day3=星期五,#3=第三個);“2#1”就意味著“每月第1個星期一”;“4#5”就意味著“每月第5個星期3。需要注意的是“#5”,如果在當月沒有第5個星期三,則觸發器不會觸發。

  • C

只能在日期和星期字段中使用,表示計劃所關聯的誒其,如果日期沒有被關聯,相當於日曆中的所有日期,如5C在日期字段相當於5號之後的第一天,1C在日期字段使用相當於星期填後的第一天

示例:

SpringBoot2.0實戰(32)配置定時任務


分享到:


相關文章: