【定時任務】學會自己寫cron表達式

引言

定時任務接觸的框架不少,每個定時任務都會寫一個cron表達式,也就是定時任務的執行時間。以前每次寫,不管是每隔多少分鐘執行一次,每天幾點執行一次,都是現查寫上就行。

而現在這個項目組,每次上線時間都不確定,有時候需要執行一些刷歷史數據或者遷移數據的任務,都需要上線後,現改個最近的時間。這種情況下,覺得還是對cron表達式學習一下比較好。

Cron表達式

語法格式

Cron表達式是一個字符串,字符串以5或6個空格隔開,分爲6或7個域,每一個域代表一個含義,Cron有如下兩種語法格式:

  • Seconds Minutes Hours DayofMonth Month DayofWeek Year
  • Seconds Minutes Hours DayofMonth Month DayofWeek
域和對應字符

每一個域可出現的字符如下:

  • Seconds:可出現", - * /"四個字符,有效範圍爲0-59的整數
  • Minutes:可出現", - * /"四個字符,有效範圍爲0-59的整數
  • Hours:可出現", - * /"四個字符,有效範圍爲0-23的整數
  • DayofMonth:可出現", - * / ? L W C"八個字符,有效範圍爲0-31的整數
  • Month:可出現", - * /"四個字符,有效範圍爲1-12的整數或JAN-DEC
  • DayofWeek:可出現", - * / ? L C #"四個字符,有效範圍爲1-7的整數或SUN-SAT兩個範圍。1表示星期天,2表示星期一, 依次類推
  • Year:可出現", - * /"四個字符,有效範圍爲1970-2099年
特殊字符含義

每一個域都使用數字,但還可以出現如下特殊字符,它們的含義是:

(1)星*:表示匹配該域的任意值,假如在Minutes域使用*, 即表示每分鐘都會觸發事件。

(2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因爲DayofMonth和 DayofWeek會相互影響。

(3)-:表示範圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次

(4)/:表示起始時間開始觸發,然後每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味着5分鐘觸發一次,而25,45等分別觸發一次.

(5),:表示列出枚舉值。例如:在Minutes域使用5,20,則意味着在5和20分每分鐘觸發一次。

(6)L:表示最後,只能出現在DayofWeek和DayofMonth域,表示爲每月的最後一天,或每個月的最後星期幾。如果在DayofWeek域使用5L,意味着在最後的一個星期四觸發。

(7)W:表示有效工作日(週一到週五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。如“15W”放在每月(day-of-month)字段上表示爲“到本月15日最近的工作日”

(8)LW:這兩個字符可以連用,表示在某個月最後一個工作日,即最後一個星期五。

(9)#:是用來指定“的”每月第n個工作日,例 在每週(day-of-week)這個字段中內容爲"6#3" or “FRI#3” 則表示“每月第三個星期五”。

示例

通過上面的總結,不是很複雜的cron表達式我們應該可以很快寫出來了,下面就舉幾個示例再鞏固一下:

  • 每隔5秒執行一次:*/5 * * * * ?
  • 每隔1分鐘執行一次:0 */1 * * * ?
  • 每天23點執行一次:0 0 23 * * ?
  • 每天凌晨1點執行一次:0 0 1 * * ?
  • 每月1號凌晨1點執行一次:0 0 1 1 * ?
  • 每月最後一天23點執行一次:0 0 23 L * ?
  • 每週星期天凌晨1點實行一次:0 0 1 ? * L
  • 每天的0點、13點、18點、21點都執行一次:0 0 0,13,18,21 * * ?
在線工具

在線Cron表達式生成器,提供一個在線生成的工具,以備不時之需。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章