Spring定時(shí)任務(wù)之fixedRateString的實(shí)現(xiàn)示例
在 Spring Framework 的開發(fā)中,@Scheduled
注解是我們實(shí)現(xiàn)定時(shí)任務(wù)的利器。其中,fixedRateString
屬性允許我們通過字符串來配置任務(wù)執(zhí)行的固定速率。從 Spring 5 開始,為了更好地支持 Java 8 的日期時(shí)間 API,fixedRateString
(以及 fixedDelayString
, initialDelayString
)開始支持 java.time.Duration
的格式進(jìn)行解析。
這為我們提供了比毫秒數(shù)字更優(yōu)雅、更易讀的配置方式。今天,我們就來深入探討一下這個(gè)強(qiáng)大的功能。
從毫秒到 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ù)時(shí)間格式。
其正則表達(dá)式定義如下: ([-+]?)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ù)時(shí)間段的開始。T
(可選): 是“Time”的縮寫,用于分隔日期部分和時(shí)間部分。如果要指定小時(shí)、分鐘或秒,則必須有T
。
日期部分 (在 P
之后,T
之前):
Y
- 年M
- 月W
- 周D
- 天
時(shí)間部分 (在 T
之后):
H
- 小時(shí)M
- 分鐘S
- 秒 (可以包含小數(shù),使用.
或,
分隔,例如PT30.5S
是 30.5 秒)
重要提示: 對(duì)于 Duration
類型,它主要用于衡量精確的時(shí)間段,而不是用于基于日歷的、不精確的時(shí)間段。因此,在解析時(shí),年(Y)
和 月(M)
會(huì)被忽略(一個(gè)月的天數(shù)不固定,無法精確轉(zhuǎn)換為 Duration
)。周(W)
和 天(D)
則會(huì)被正常轉(zhuǎn)換(1天=24小時(shí),1周=7天)。
這意味著,雖然格式允許 Y
和 M
,但在 Duration
的語境下,它們是沒有意義的。你應(yīng)該專注于使用 D
, H
, M
, S
。
實(shí)戰(zhàn)示例
讓我們看一些在 @Scheduled
中有效的配置示例:
- 5 秒:
PT5S
- 30 分鐘:
PT30M
或PT1800S
- 2 小時(shí):
PT2H
- 2 小時(shí) 30 分鐘:
PT2H30M
- 1 天:
P1D
(相當(dāng)于PT24H
) - 1 天 6 小時(shí):
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)用啟動(dòng)后,先延遲 1天半 (36小時(shí)),然后每10秒執(zhí)行一次 }
常見錯(cuò)誤與陷阱
忘記
T
分隔符:- 錯(cuò)誤:
P1H30M
(試圖在日期部分指定小時(shí)) - 正確:
PT1H30M
(必須用T
引入時(shí)間部分)
- 錯(cuò)誤:
使用
Y
或M
:- 無效:
P1M
(期望是1個(gè)月,但實(shí)際會(huì)被解析為 0) - 無效:
P1Y1M
(年份和月份都會(huì)被忽略,解析結(jié)果也是 0) - 如果需要“大約一個(gè)月”這種基于日歷的概念,
Duration
不是正確的工具,應(yīng)考慮Cron
表達(dá)式。
- 無效:
負(fù)值: 格式支持負(fù)值(
-PT5S
),但這在調(diào)度場(chǎng)景中沒有意義,會(huì)導(dǎo)致異常。
總結(jié)
將 java.time.Duration
的 ISO-8601 格式與 Spring 的 @Scheduled
注解結(jié)合使用,極大地提升了配置的可讀性和可維護(hù)性。
記住這個(gè)口訣:先寫 P,要時(shí)間再加 T,忽略 Y 和 M,D/H/M/S 放心用。
到此這篇關(guān)于Spring定時(shí)任務(wù)之fixedRateString的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Spring定時(shí)任務(wù)fixedRateString內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring 定時(shí)任務(wù)@Scheduled詳解
- 詳解SpringBoot 創(chuàng)建定時(shí)任務(wù)(配合數(shù)據(jù)庫動(dòng)態(tài)執(zhí)行)
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
- SpringBoot中實(shí)現(xiàn)定時(shí)任務(wù)的4種方式詳解
- Spring內(nèi)置定時(shí)任務(wù)調(diào)度@Scheduled使用詳解
- SpringBoot 定時(shí)任務(wù)遇到的坑
- springboot集成schedule實(shí)現(xiàn)定時(shí)任務(wù)
- Springboot定時(shí)任務(wù)Scheduled重復(fù)執(zhí)行操作
相關(guān)文章
Spring聲明式事務(wù)和@Aspect的攔截順序問題的解決
本篇文章主要介紹了Spring聲明式事務(wù)和@Aspect的攔截順序問題的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05解決springmvc整合Mybatis的Log4j日志輸出問題
這篇文章主要介紹了解決springmvc整合Mybatis的Log4j日志輸出問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java中double數(shù)值保留兩位小數(shù)的4種實(shí)現(xiàn)方式舉例
在Java編程中,我們經(jīng)常遇到需要對(duì)double類型的浮點(diǎn)數(shù)進(jìn)行精確截?cái)嗷蛩纳嵛迦氡A魞晌恍?shù)的需求,這篇文章主要給大家介紹了關(guān)于Java中double數(shù)值保留兩位小數(shù)的4種實(shí)現(xiàn)方式,需要的朋友可以參考下2024-07-07Spring Boot使用GridFS實(shí)現(xiàn)文件的上傳和下載方式
這篇文章主要介紹了Spring Boot使用GridFS實(shí)現(xiàn)文件的上傳和下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Spring boot+beetl+i18n國(guó)際化處理的方法
這篇文章主要介紹了Spring boot+beetl+i18n國(guó)際化處理的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

java.io.NotSerializableException異常的問題及解決

Struts2 文件上傳進(jìn)度條的實(shí)現(xiàn)實(shí)例代碼

AgileBoot?項(xiàng)目?jī)?nèi)統(tǒng)一的錯(cuò)誤碼設(shè)計(jì)分析