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