Spring Boot 2.4 新特性,全新的Cron表達式處理機制

提及 cron 表達式你們必定不陌生,咱們經常使用來做爲定時任務執行策略規則。 在 Spring Boot 框架中 cron 表達式主要配合 @Scheduled 註解在應用程序中使用。 在 Spring Boot 2.4 (既 Spring 5.3)之後,引入了 CronExpression
表達式處理器來替代原有的 CronSequenceGenerator。java

爲何要替代原有的 CronSequenceGenerator ? 此處理器是基於 java.util.Calendar侷限性比較大,沒法完成last day of month 語義。express

  • 例如利用CronExpression 計算表達式下次執行時間
LocalDateTime now = LocalDateTime.now();
  System.out.println("當前運行時間: " + now);

  // 每小時執行一次
  CronExpression expression1 = CronExpression.parse("0 0 0/1 * * *");
  LocalDateTime nextTime = expression1.next(now);
  System.out.println("每小時執行一次 -> 下次執行時間: " + nextTime);

   // 每小時第十分執行一次
  CronExpression expression2 = CronExpression.parse("0 10 0/1 * * *");
  LocalDateTime nextTime2 = expression2.next(now);
  System.out.println("每小時第十分執行 -> 下次執行時間: " + nextTime2);
  • 執行結果
當前運行時間: 2020-11-14T23:04:46.302739
每小時執行一次 ->   下次執行時間: 2020-11-15T00:00
每小時第十分執行 -> 下次執行時間: 2020-11-14T23:10

新增經常使用表達式通用宏

對於非開發人員來講 cron 表達式並不容易理解,因此很難在出現錯誤的時候進行修復。好比筆者會把 cron 表達式 在在線網站 模擬運行一下,確認執行過程方便排查問題。框架

爲了提升可讀性,Spring Boot 如今支持如下表明經常使用表達式的宏。可使用這些宏而不是六位的表達式,所以:網站

@Scheduled(cron = "@hourly")。

至關於url

@Scheduled(cron = "0 0 * * * *")

其餘經常使用宏命令

cron 表達式 含義
@yearly 0 0 0 1 1 \* 每一年執行一次
@monthly 0 0 0 1 \ \ 每個月執行一次
@weekly 0 0 0 \ \ 0 每週執行一次
@daily 或@annually 0 0 0 \ \ \* 天天執行一次
@hourly 0 0 \ \ \ \ 每小時執行一次

加強原有表達式 最後幾天

每週的第幾天
           |
           ∨
 * * * * * *
       ^
       |
    每個月的第幾天

如上其中的 每個月的第幾天每週的第幾天 支持 最後幾天 (L) 的語義
例如:spa

0 0 0 L * *   每個月最後一天的零時

0 0 0 L-3 * *   每個月最後第三天的零時  (L-d 格式)

0 0 0 * * 5L    每個月最後的星期五零時  (dL 格式)

0 0 0 * * FRIL  每個月最後的星期五零時  ( (星期一星期天的英文縮寫)L 格式)

加強原有表達式 工做日

* * * * * *
       ^
       |
    每個月的第幾天

如上其中的 每個月的第幾天 支持 工做日 (W)的語義
例如:code

0 0 0 1W * * 每個月的第一個工做日零時
0 0 0 LW * * 每個月的最後一個工做日零時

加強原有表達式 幾周的星期幾

每週的第幾天
           |
           ∨
 * * * * * *

如上其中的 每週的第幾天 支持 每個月第幾周的第幾天語義
例如開發

0 0 0 ? * 5#2     每個月第二週的星期五零時

0 0 0 ? * MON#1    每個月週一的星期一零時

image

相關文章
相關標籤/搜索