Spring Boot 2.4 全新Cron表達(dá)式處理機(jī)制
說(shuō)起 cron 表達(dá)式大家一定不陌生,我們常用來(lái)作為定時(shí)任務(wù)執(zhí)行策略規(guī)則。在 Spring Boot 框架中 cron 表達(dá)式主要配合 @Scheduled 注解在應(yīng)用程序中使用。在 Spring Boot 2.4 (既 Spring 5.3)以后,引入了 CronExpression 表達(dá)式處理器來(lái)替代原有的 CronSequenceGenerator。
為什么要替代原有的 CronSequenceGenerator ? 此處理器是基于 java.util.Calendar局限性比較大,無(wú)法完成last day of month 語(yǔ)義。
例如利用CronExpression 計(jì)算表達(dá)式下次執(zhí)行時(shí)間
??LocalDateTime?now?=?LocalDateTime.now();
??System.out.println("當(dāng)前運(yùn)行時(shí)間:?"?+?now);
??//?每小時(shí)執(zhí)行一次
??CronExpression?expression1?=?CronExpression.parse("0?0?0/1?*?*?*");
??LocalDateTime?nextTime?=?expression1.next(now);
??System.out.println("每小時(shí)執(zhí)行一次?->?下次執(zhí)行時(shí)間:?"?+?nextTime);
???//?每小時(shí)第十分執(zhí)行一次
??CronExpression?expression2?=?CronExpression.parse("0?10?0/1?*?*?*");
??LocalDateTime?nextTime2?=?expression2.next(now);
??System.out.println("每小時(shí)第十分執(zhí)行?->?下次執(zhí)行時(shí)間:?"?+?nextTime2);
執(zhí)行結(jié)果
當(dāng)前運(yùn)行時(shí)間:?2020-11-14T23:04:46.302739
每小時(shí)執(zhí)行一次?->???下次執(zhí)行時(shí)間:?2020-11-15T00:00
每小時(shí)第十分執(zhí)行?->?下次執(zhí)行時(shí)間:?2020-11-14T23:10
新增常用表達(dá)式通用宏
對(duì)于非開發(fā)人員來(lái)說(shuō) cron 表達(dá)式并不容易理解,所以很難在出現(xiàn)錯(cuò)誤的時(shí)候進(jìn)行修復(fù)。比如筆者會(huì)把 cron 表達(dá)式 在在線網(wǎng)站[1] 模擬運(yùn)行一下,確認(rèn)執(zhí)行過(guò)程方便排查問(wèn)題。
為了提高可讀性,Spring Boot 現(xiàn)在支持以下代表常用表達(dá)式的宏。可以使用這些宏而不是六位的表達(dá)式,因此:
@Scheduled(cron?=?"@hourly")。
相當(dāng)于
@Scheduled(cron?=?"0?0?*?*?*?*")
其他常用宏命令
| 宏 | cron 表達(dá)式 | 含義 |
|---|---|---|
| @yearly | 0 0 0 1 1 * | 每年執(zhí)行一次 |
| @monthly | 0 0 0 1 * * | 每月執(zhí)行一次 |
| @weekly | 0 0 0 * * 0 | 每周執(zhí)行一次 |
| @daily 或@annually | 0 0 0 * * * | 每天執(zhí)行一次 |
| @hourly | 0 0 * * * * | 每小時(shí)執(zhí)行一次 |
增強(qiáng)原有表達(dá)式 最后幾天
???????每周的第幾天
???????????|
???????????∨
?*?*?*?*?*?*
???????^
???????|
????每月的第幾天
如上其中的 每月的第幾天、每周的第幾天 支持 最后幾天 (L) 的語(yǔ)義
例如:
0?0?0?L?*?*???每月最后一天的零時(shí)
0?0?0?L-3?*?*???每月最后第三天的零時(shí)??(L-d?格式)
0 0 0 L-3 * *???每月最后第三天的零時(shí)
0?0?0?*?*?5L????每月最后的星期五零時(shí)??(dL?格式)
0?0?0?*?*?FRIL??每月最后的星期五零時(shí)??(?(星期一星期天的英文縮寫)L?格式)
增強(qiáng)原有表達(dá)式 工作日
?*?*?*?*?*?*
???????^
???????|
????每月的第幾天
如上其中的 每月的第幾天 支持 工作日 (W)的語(yǔ)義
例如:
0?0?0?1W?*?*?每月的第一個(gè)工作日零時(shí)
0?0?0?LW?*?*?每月的最后一個(gè)工作日零時(shí)
增強(qiáng)原有表達(dá)式 幾周的星期幾
???????每周的第幾天
???????????|
???????????∨
?*?*?*?*?*?*
如上其中的 每周的第幾天 支持 每月第幾周的第幾天語(yǔ)義
例如
0?0?0???*?5#2?????每月第二周的星期五零時(shí)
0?0?0???*?MON#1????每月周一的星期一零時(shí)
參考資料
在線網(wǎng)站: https://cron.qqe2.com/
評(píng)論
圖片
表情
