spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)
@Scheduled
注解是 Spring 提供的一個(gè)注解式定時(shí)任務(wù)調(diào)度工具,用于簡(jiǎn)化定時(shí)任務(wù)的實(shí)現(xiàn)。它的默認(rèn)行為是單線程執(zhí)行,即任務(wù)默認(rèn)在同一個(gè)線程中依次執(zhí)行。如果任務(wù)拋出異常或執(zhí)行時(shí)間過長,可能會(huì)影響后續(xù)任務(wù)的調(diào)度。
在 Spring 中,使用 @Scheduled
注解定義的多個(gè)定時(shí)任務(wù)默認(rèn)是單線程依次執(zhí)行的。這意味著,如果多個(gè)定時(shí)任務(wù)被觸發(fā)在同一時(shí)間執(zhí)行,它們會(huì)按照任務(wù)注冊(cè)的順序依次執(zhí)行,而不是并行執(zhí)行。
默認(rèn)行為
- 單線程執(zhí)行:Spring 的
@Scheduled
注解默認(rèn)使用單線程調(diào)度器(SimpleScheduledExecutor
),因此多個(gè)任務(wù)會(huì)串行執(zhí)行。 - 任務(wù)阻塞:如果一個(gè)任務(wù)執(zhí)行時(shí)間過長,會(huì)阻塞后續(xù)任務(wù)的執(zhí)行。
如何實(shí)現(xiàn)并行執(zhí)行
如果需要多個(gè)定時(shí)任務(wù)并行執(zhí)行,可以通過以下方法實(shí)現(xiàn):
方法 1:配置多線程調(diào)度器
可以通過配置 ThreadPoolTaskScheduler
來為 @Scheduled
任務(wù)提供一個(gè)線程池,從而允許多個(gè)任務(wù)并行執(zhí)行。
示例代碼:
@Configuration public class ScheduleConfig { @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); // 設(shè)置線程池大小 scheduler.setThreadNamePrefix("my-scheduled-task-"); return scheduler; } }
在 @Scheduled
注解中指定使用自定義調(diào)度器:
@Scheduled(fixedRate = 5000, scheduler = "taskScheduler") public void task1() { // 任務(wù)內(nèi)容 }
方法 2:使用 @Async注解
可以通過結(jié)合 @Async
注解和 @EnableAsync
注解,使每個(gè) @Scheduled
任務(wù)在獨(dú)立的線程中異步執(zhí)行。
示例代碼:
@Configuration @EnableAsync public class AsyncConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); // 設(shè)置線程池大小 return scheduler; } }
在任務(wù)方法上添加 @Async
注解:
@Async @Scheduled(fixedRate = 5000) public void task1() { // 任務(wù)內(nèi)容 }
方法 3:通過配置文件設(shè)置線程池大小
在 Spring Boot 中,可以通過配置文件直接設(shè)置 spring.task.scheduling.pool.size
屬性來增加線程池大小。
示例配置:
spring.task.scheduling.pool.size=5
總結(jié)
- 默認(rèn)行為:
@Scheduled
注解默認(rèn)是單線程依次執(zhí)行。 - 并行執(zhí)行:可以通過配置多線程調(diào)度器或使用
@Async
注解實(shí)現(xiàn)并行執(zhí)行。 - 推薦方式:配置多線程調(diào)度器(
ThreadPoolTaskScheduler
)是最常用的方式,適合大多數(shù)場(chǎng)景。
通過以上方法,可以輕松實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的并行執(zhí)行!
以下是 @Scheduled
注解的參數(shù)大全及其詳細(xì)說明:
1. cron
- 含義:指定一個(gè) cron 表達(dá)式,用于定義任務(wù)的執(zhí)行時(shí)間。
- 格式:cron 表達(dá)式由 6 或 7 個(gè)字段組成,分別表示秒、分、小時(shí)、日、月、星期(和年)。
- 示例:
- 每隔 5 秒執(zhí)行一次:
0/5 * * * * *
- 每天 23 點(diǎn)執(zhí)行一次:
0 0 23 * * *
- 每月 1 號(hào)凌晨 1 點(diǎn)執(zhí)行一次:
0 0 1 1 * *
- 每隔 5 秒執(zhí)行一次:
2. zone
- 含義:指定時(shí)區(qū),用于解析 cron 表達(dá)式。
- 類型:
String
,默認(rèn)值為空字符串,表示使用服務(wù)器的默認(rèn)時(shí)區(qū)。 - 示例:
Asia/Shanghai
3. fixedRate
- 含義:指定任務(wù)以固定的時(shí)間間隔執(zhí)行,單位為毫秒。
- 類型:
long
,默認(rèn)值為-1
,表示不使用固定速率。 - 示例:
@Scheduled(fixedRate = 5000)
表示每隔 5 秒執(zhí)行一次
4. fixedRateString
- 含義:與
fixedRate
類似,但使用字符串類型,支持占位符。 - 類型:
String
,默認(rèn)值為空字符串。 - 示例:
@Scheduled(fixedRateString = "5000")
表示每隔 5 秒執(zhí)行一次
5. fixedDelay
- 含義:指定任務(wù)在上一次執(zhí)行結(jié)束后,經(jīng)過固定的時(shí)間間隔再執(zhí)行下一次,單位為毫秒。
- 類型:
long
,默認(rèn)值為-1
,表示不使用固定延遲。 - 示例:
@Scheduled(fixedDelay = 5000)
表示上一次任務(wù)執(zhí)行結(jié)束后,等待 5 秒再執(zhí)行下一次
6. fixedDelayString
含義:與 fixedDelay
類似,但使用字符串類型,支持占位符。
類型:String
,默認(rèn)值為空字符串。
示例:@Scheduled(fixedDelayString = "5000")
表示上一次任務(wù)執(zhí)行結(jié)束后,等待 5 秒再執(zhí)行下一次
7. initialDelay
- 含義:指定任務(wù)首次執(zhí)行前的延遲時(shí)間,單位為毫秒。
- 類型:
long
,默認(rèn)值為-1
,表示不使用初始延遲。 - 示例:
@Scheduled(initialDelay = 5000, fixedRate = 10000)
表示首次延遲 5 秒后執(zhí)行,之后每隔 10 秒執(zhí)行一次
8. initialDelayString
- 含義:與
initialDelay
類似,但使用字符串類型,支持占位符。 - 類型:
String
,默認(rèn)值為空字符串。 - 示例:
@Scheduled(initialDelayString = "5000", fixedRateString = "10000")
表示首次延遲 5 秒后執(zhí)行,之后每隔 10 秒執(zhí)行一次
9. CRON_DISABLED
- 含義:一個(gè)特殊的 cron 表達(dá)式值,用于禁用定時(shí)任務(wù)。
- 值:
"-"
,當(dāng) cron 表達(dá)式設(shè)置為"-"
時(shí),任務(wù)將被禁用
總結(jié)
cron
:適合復(fù)雜的定時(shí)任務(wù)調(diào)度,如按特定時(shí)間點(diǎn)執(zhí)行。fixedRate
和fixedDelay
:適合簡(jiǎn)單的定時(shí)任務(wù)調(diào)度,如每隔固定時(shí)間執(zhí)行。initialDelay
:用于控制任務(wù)的首次執(zhí)行時(shí)間。zone
:用于指定時(shí)區(qū),確保任務(wù)按正確的時(shí)區(qū)執(zhí)行。
通過合理使用這些參數(shù),可以靈活地配置定時(shí)任務(wù)的執(zhí)行計(jì)劃,滿足各種業(yè)務(wù)需求。
到此這篇關(guān)于spring @Scheduled定時(shí)任務(wù)注解使用方法以及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)spring @Scheduled定時(shí)任務(wù)注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring自帶定時(shí)任務(wù)@Scheduled注解實(shí)例講解
- Spring定時(shí)任務(wù)@scheduled多線程使用@Async注解示例
- Spring定時(shí)任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)
- Spring中的@Scheduled定時(shí)任務(wù)注解詳解
- SpringBoot中@Scheduled()注解以及cron表達(dá)式詳解
- Spring 定時(shí)任務(wù)@Scheduled 注解中的 Cron 表達(dá)式詳解
- SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀
- spring-boot通過@Scheduled配置定時(shí)任務(wù)及定時(shí)任務(wù)@Scheduled注解的方法
- 詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)
相關(guān)文章
java讀寫ini文件、FileOutputStream問題
這篇文章主要介紹了java讀寫ini文件、FileOutputStream問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語句解讀
這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot文件上傳功能的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot文件上傳功能的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java實(shí)戰(zhàn)之仿天貓商城系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java制作一個(gè)基于SSM框架的迷你天貓商城系統(tǒng),文中采用的技術(shù)有JSP、Springboot、SpringMVC、Spring等,需要的可以參考一下2022-03-03SpringBoot?將配置文件掛到?jar?包外面的操作方法
在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下2023-03-03JAVA發(fā)送HTTP請(qǐng)求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼
這篇文章主要介紹了JAVA發(fā)送HTTP請(qǐng)求,返回HTTP響應(yīng)內(nèi)容,應(yīng)用及實(shí)例代碼,需要的朋友可以參考下2014-02-02為什么不建議使用Java自定義Object作為HashMap的key
這篇文章主要介紹了為什么不建議使用Java自定義Object作為HashMap的key,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器
這篇文章主要介紹了詳解SpringBoot開發(fā)使用@ImportResource注解影響攔截器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11