Spring定時任務(wù)之fixedRateString的實現(xiàn)示例
在 Spring Framework 的開發(fā)中,@Scheduled 注解是我們實現(xiàn)定時任務(wù)的利器。其中,fixedRateString 屬性允許我們通過字符串來配置任務(wù)執(zhí)行的固定速率。從 Spring 5 開始,為了更好地支持 Java 8 的日期時間 API,fixedRateString(以及 fixedDelayString, initialDelayString)開始支持 java.time.Duration 的格式進行解析。
這為我們提供了比毫秒數(shù)字更優(yōu)雅、更易讀的配置方式。今天,我們就來深入探討一下這個強大的功能。
從毫秒到 Duration:為何要改變?
在舊版本中,我們通常這樣配置:
@Scheduled(fixedRate = 5000) // 每5秒執(zhí)行一次
public void doTask() {
// 任務(wù)邏輯
}
或者使用字符串形式(為了支持占位符):
@Scheduled(fixedRateString = "5000") // 從配置文件中讀取,例如:scheduled.rate=5000
public void doTask() {
// 任務(wù)邏輯
}
這種方式雖然直接,但可讀性較差??吹?5000,你需要反應(yīng)一下才知道是 5 秒。而 Duration 格式則一目了然:
@Scheduled(fixedRateString = "PT5S") // 清晰明了:Period of Time 5 Seconds
public void doTask() {
// 任務(wù)邏輯
}
核心:java.time.Duration.parse 支持的格式
Spring 底層使用 java.time.Duration.parse(CharSequence) 方法來解析 fixedRateString 的值。該方法遵循 ISO-8601 持續(xù)時間格式。
其正則表達式定義如下: ([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?
看起來復(fù)雜,但其結(jié)構(gòu)非常清晰,可以分解為:
基本結(jié)構(gòu): P[n]Y[n]M[n]W[n]D[T[n]H[n]M[n]S]]
P(必需): 是“Period”的縮寫,表示持續(xù)時間段的開始。T(可選): 是“Time”的縮寫,用于分隔日期部分和時間部分。如果要指定小時、分鐘或秒,則必須有T。
日期部分 (在 P 之后,T 之前):
Y- 年M- 月W- 周D- 天
時間部分 (在 T 之后):
H- 小時M- 分鐘S- 秒 (可以包含小數(shù),使用.或,分隔,例如PT30.5S是 30.5 秒)
重要提示: 對于 Duration 類型,它主要用于衡量精確的時間段,而不是用于基于日歷的、不精確的時間段。因此,在解析時,年(Y) 和 月(M) 會被忽略(一個月的天數(shù)不固定,無法精確轉(zhuǎn)換為 Duration)。周(W) 和 天(D) 則會被正常轉(zhuǎn)換(1天=24小時,1周=7天)。
這意味著,雖然格式允許 Y 和 M,但在 Duration 的語境下,它們是沒有意義的。你應(yīng)該專注于使用 D, H, M, S。
實戰(zhàn)示例
讓我們看一些在 @Scheduled 中有效的配置示例:
- 5 秒:
PT5S - 30 分鐘:
PT30M或PT1800S - 2 小時:
PT2H - 2 小時 30 分鐘:
PT2H30M - 1 天:
P1D(相當(dāng)于PT24H) - 1 天 6 小時:
P1DT6H - 1.5 秒 (1500毫秒):
PT1.5S - 從配置文件讀取:
application.properties:my.task.rate=PT10S my.task.delay=P1DT12H
Java Code:@Scheduled(fixedRateString = "${my.task.rate}", initialDelayString = "${my.task.delay}") public void doScheduledTask() { // 應(yīng)用啟動后,先延遲 1天半 (36小時),然后每10秒執(zhí)行一次 }
常見錯誤與陷阱
忘記
T分隔符:- 錯誤:
P1H30M(試圖在日期部分指定小時) - 正確:
PT1H30M(必須用T引入時間部分)
- 錯誤:
使用
Y或M:- 無效:
P1M(期望是1個月,但實際會被解析為 0) - 無效:
P1Y1M(年份和月份都會被忽略,解析結(jié)果也是 0) - 如果需要“大約一個月”這種基于日歷的概念,
Duration不是正確的工具,應(yīng)考慮Cron表達式。
- 無效:
負(fù)值: 格式支持負(fù)值(
-PT5S),但這在調(diào)度場景中沒有意義,會導(dǎo)致異常。
總結(jié)
將 java.time.Duration 的 ISO-8601 格式與 Spring 的 @Scheduled 注解結(jié)合使用,極大地提升了配置的可讀性和可維護性。
記住這個口訣:先寫 P,要時間再加 T,忽略 Y 和 M,D/H/M/S 放心用。
到此這篇關(guān)于Spring定時任務(wù)之fixedRateString的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring定時任務(wù)fixedRateString內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中關(guān)于Null的9個解釋(Java Null詳解)
這篇文章主要介紹了Java中關(guān)于Null的9個解釋(Java Null詳解),本文詳細講解了Java中Null的9個相關(guān)知識,需要的朋友可以參考下2015-01-01
JUC中Future及CompletableFuture的用法與說明
本文介紹了Future接口及其實現(xiàn)類FutureTask的使用方法,指出了其阻塞和CPU空轉(zhuǎn)問題,為了解決這些問題,介紹了CompletableFuture的異步任務(wù)編排,可以自動回調(diào)異步任務(wù)結(jié)束時的方法,解決了阻塞和輪詢問題,同時提供了鏈?zhǔn)秸{(diào)用、函數(shù)式編程等等提高編程效率2026-04-04
SpringBoot生成PDF的五種實現(xiàn)方法總結(jié)
這篇文章主要介紹了SpringBoot生成PDF的五種實現(xiàn)方法,在開發(fā)中經(jīng)常會遇到需要進行對一些數(shù)據(jù)進行動態(tài)導(dǎo)出PDF文件,然后讓用戶自己選擇是否需要打印出來,這篇文章我們來介紹五種實現(xiàn)方法,需要的朋友可以參考下2024-10-10
mybatis createcriteria和or的區(qū)別說明
這篇文章主要介紹了mybatis createcriteria和or的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

