最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot?@Scheduled?Cron表達(dá)式使用方式

 更新時間:2025年03月24日 10:55:56   作者:王小工  
這篇文章主要介紹了SpringBoot?@Scheduled?Cron表達(dá)式使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Cron 表達(dá)式詳解

Cron 表達(dá)式是用于定義定時任務(wù)執(zhí)行時間的字符串,廣泛應(yīng)用于 Spring 的 @Scheduled、Quartz 等定時任務(wù)框架。

其核心是通過 ‌時間字段‌ 和 ‌通配符‌ 組合實現(xiàn)復(fù)雜的調(diào)度規(guī)則。

1. 表達(dá)式格式‌

Cron 表達(dá)式由 ‌6或7個字段‌ 組成,分別表示不同時間單位(Spring 中通常用 ‌6位‌ 格式)。

格式如下:

字段允許值特殊字符說明
秒(Seconds)0-59, - * /可精確到秒級調(diào)度
分(Minutes)0-59, - * /
小時(Hours)0-23, - * /
日(Day)1-31, - * / ? L W月份中的某一天
月(Month)1-12 或 JAN-DEC, - * /
周(Week)0-7 或 SUN-SAT (0=周日), - * / ? L #周幾(1=MON, 7=SUN)
年(Year)1970-2099 (可選), - * /‌Spring 中通常省略

2. 特殊字符解析

符號作用示例
*匹配任意值0 * * * * ? 每分鐘的0秒執(zhí)行
?僅在 ‌日‌ 或 ‌周‌ 字段使用,表示“無意義”0 0 0 * * ? 每天0點執(zhí)行
-范圍區(qū)間0 0 10-12 * * ? 10-12點每小時執(zhí)行
,多個值0 0 2,14 * * ? 每天2點和14點執(zhí)行
/步長(間隔時間)0 0/5 * * * ? 每隔5分鐘執(zhí)行
L最后一天(僅 ‌日‌ 或 ‌周‌ 字段)0 0 L * * ? 每月最后一天0點執(zhí)行
W最近工作日(僅 ‌日‌ 字段)0 0 0 15W * ? 每月15日最近的工作日執(zhí)行
#指定月份的周幾(僅 ‌周‌ 字段)0 0 0 ? * 6#3 每月第3個周五執(zhí)行

3. 常用示例

表達(dá)式說明
0 0 12 * * ?每天中午12點執(zhí)行
0 0/5 14 * * ?每天下午2點開始,每隔5分鐘執(zhí)行一次
0 15 10 ? * MON-FRI每周一至周五上午10:15執(zhí)行
0 0 0 1 1 ? 20242024年1月1日0點執(zhí)行(需7位表達(dá)式)
0 0 8-18/2 ? * MON每周一上午8點到下午6點,每隔2小時執(zhí)行一次
0 0 0 L * ?每月最后一天的0點執(zhí)行
0 0 0 15W * ?每月15日最近的工作日執(zhí)行
0 0 0 ? * 6#3每月第3個周五0點執(zhí)行

‌4. 重點規(guī)則

‌1. 日與周的互斥性‌

  • 若同時指定 ‌日‌ 和 ‌周‌,需用 ? 忽略其中一個字段。
  • ? 正確:0 0 0 ? * MON(每周一執(zhí)行,忽略日)
  • ? 錯誤:0 0 0 * * MON(日和周同時生效,可能沖突)

2‌. 月份和星期的縮寫‌

  • 月份:JAN, FEB, MAR… DEC
  • 星期:SUN, MON, TUE… SAT
  1. L 和 W 的組合‌
  • LW 表示當(dāng)月的最后一個工作日。
  • L-3 表示倒數(shù)第3天。‌
  1. 年份字段(可選)‌
  • Spring 的 @Scheduled ‌不支持年份字段‌,需用6位表達(dá)式。

5. 動態(tài)與復(fù)雜場景‌

1‌. 動態(tài) Cron 表達(dá)式‌

  • Spring 中可通過 @Scheduled(cron = “${cron.expression}”) 從配置文件讀取。
  • 結(jié)合數(shù)據(jù)庫動態(tài)更新任務(wù):
@Scheduled(cron = "#{@cronService.getCronExpression()}")
public void dynamicTask() {
    // 業(yè)務(wù)邏輯
}

2‌. 避開整點任務(wù)高峰‌

  • 添加隨機(jī)延遲(避免多個任務(wù)同時觸發(fā)):
@Scheduled(cron = "0 #{T(java.util.concurrent.ThreadLocalRandom).current().nextInt(55)} * * * ?")
public void randomMinuteTask() {
    // 每小時隨機(jī)分鐘執(zhí)行
}

3‌. 閏年處理‌

  • Cron 無法直接處理閏年,需結(jié)合代碼邏輯判斷。

6. 調(diào)試與驗證‌

1‌. 在線工具‌

  • Crontab Guru:快速驗證表達(dá)式。
  • CronMaker:生成表達(dá)式并查看下次執(zhí)行時間。
  1. 日志調(diào)試‌
  • 在任務(wù)方法中添加日志,觀察觸發(fā)時間是否符合預(yù)期:
@Scheduled(cron = "0 0/5 * * * ?")
public void logTask() {
    log.info("任務(wù)執(zhí)行時間: {}", LocalDateTime.now());
}

7. 常見問題‌

‌1. 為什么任務(wù)沒有執(zhí)行?‌

  • 檢查是否添加 @EnableScheduling。
  • 檢查 Cron 表達(dá)式是否正確(如 Spring 不支持年份字段)。
  • 檢查時區(qū)設(shè)置(默認(rèn)使用服務(wù)器時區(qū),可通過 zone 屬性修改)。

‌2. 如何實現(xiàn)每隔 N 天執(zhí)行?‌

  • 方案1:使用 0 0 0 */N * ?(如 0 0 0 */5 * ? 每隔5天執(zhí)行)。
  • 方案2:通過代碼記錄上一次執(zhí)行時間。

‌3. 分布式環(huán)境下的冪等性‌

使用 Redis 分布式鎖:

@Scheduled(cron = "0 0 * * * ?")
public void distributedTask() {
    if (redisLock.tryLock("taskLock", 10)) {
        try {
            // 業(yè)務(wù)邏輯
        } finally {
            redisLock.unlock("taskLock");
        }
    }
}

總結(jié)‌

Cron 表達(dá)式通過簡潔的語法實現(xiàn)了靈活的定時規(guī)則,但需注意 ‌字段互斥性‌ 和 ‌特殊字符的適用場景‌。

在復(fù)雜業(yè)務(wù)中,可結(jié)合動態(tài)配置、分布式鎖和日志監(jiān)控來確保任務(wù)穩(wěn)定執(zhí)行。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程深入理解

    Java多線程深入理解

    這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • Netty分布式ByteBuf緩沖區(qū)分配器源碼解析

    Netty分布式ByteBuf緩沖區(qū)分配器源碼解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf緩沖區(qū)分配器源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java實現(xiàn)自定義語言和表達(dá)式解析的解釋器模式

    Java實現(xiàn)自定義語言和表達(dá)式解析的解釋器模式

    Java解釋器設(shè)計模式通過解析自定義語言和表達(dá)式,實現(xiàn)對復(fù)雜邏輯的處理,提高程序可擴(kuò)展性和靈活性。它將語法解析和執(zhí)行過程分離,通過抽象語法樹和解釋器實現(xiàn)對語言和表達(dá)式的解析和求值,避免了硬編碼和復(fù)雜的條件判斷,提高了程序的可讀性和可維護(hù)性
    2023-04-04
  • Spring bean為什么默認(rèn)是單例

    Spring bean為什么默認(rèn)是單例

    這篇文章主要介紹了Spring bean為什么默認(rèn)是單例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 簡單說說Java SE、Java EE、Java ME三者之間的區(qū)別

    簡單說說Java SE、Java EE、Java ME三者之間的區(qū)別

    本篇文章小編就為大家簡單說說Java SE、Java EE、Java ME三者之間的區(qū)別。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 詳解SpringMVC注解版前臺向后臺傳值的兩種方式

    詳解SpringMVC注解版前臺向后臺傳值的兩種方式

    本篇文章主要介紹了詳解SpringMVC注解版前臺向后臺傳值的兩種方式,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • 關(guān)于Maven混合配置私有倉庫和公共倉庫的問題

    關(guān)于Maven混合配置私有倉庫和公共倉庫的問題

    這篇文章主要介紹了Maven混合配置私有倉庫和公共倉庫,通過實例代碼詳細(xì)介紹了私有和公共倉庫混合配置的方法,需要的朋友可以參考下
    2022-06-06
  • 在SpringBoot項目中使用Jasypt加密敏感配置信息的完整方案

    在SpringBoot項目中使用Jasypt加密敏感配置信息的完整方案

    本文詳細(xì)介紹了在SpringBoot項目中使用Jasypt進(jìn)行配置文件加密的方法,包括環(huán)境配置、代碼示例、多環(huán)境部署等常見問題排查,助你實現(xiàn)安全配置管理,需要的朋友可以參考下
    2026-06-06
  • Java實現(xiàn)五子棋游戲的完整代碼

    Java實現(xiàn)五子棋游戲的完整代碼

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)五子棋游戲的完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Java格式化日期和時間三種方法

    Java格式化日期和時間三種方法

    這篇文章主要給大家介紹了關(guān)于Java格式化日期和時間三種方法的相關(guān)資料,最近遇到很多在Java里獲取當(dāng)前時間的問題,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評論

陆川县| 鹿邑县| 原平市| 北川| 永宁县| 班玛县| 澳门| 罗山县| 阜阳市| 平乐县| 大冶市| 三亚市| 南江县| 岑巩县| 炉霍县| 内丘县| 武功县| 密山市| 织金县| 茂名市| 苗栗市| 高尔夫| 普陀区| 专栏| 黑龙江省| 靖安县| 沽源县| 永清县| 湘阴县| 富裕县| 大埔区| 浠水县| 武夷山市| 阳原县| 揭阳市| 尚志市| 曲水县| 江陵县| 金川县| 高尔夫| 金山区|