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í)間過(guò)長(zhǎng),可能會(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í)間過(guò)長(zhǎng),會(huì)阻塞后續(xù)任務(wù)的執(zhí)行。
如何實(shí)現(xiàn)并行執(zhí)行
如果需要多個(gè)定時(shí)任務(wù)并行執(zhí)行,可以通過(guò)以下方法實(shí)現(xiàn):
方法 1:配置多線程調(diào)度器
可以通過(guò)配置 ThreadPoolTaskScheduler 來(lái)為 @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注解
可以通過(guò)結(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:通過(guò)配置文件設(shè)置線程池大小
在 Spring Boot 中,可以通過(guò)配置文件直接設(shè)置 spring.task.scheduling.pool.size 屬性來(lái)增加線程池大小。
示例配置:
spring.task.scheduling.pool.size=5
總結(jié)
- 默認(rèn)行為:
@Scheduled注解默認(rèn)是單線程依次執(zhí)行。 - 并行執(zhí)行:可以通過(guò)配置多線程調(diào)度器或使用
@Async注解實(shí)現(xiàn)并行執(zhí)行。 - 推薦方式:配置多線程調(diào)度器(
ThreadPoolTaskScheduler)是最常用的方式,適合大多數(shù)場(chǎng)景。
通過(guò)以上方法,可以輕松實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的并行執(zhí)行!
以下是 @Scheduled 注解的參數(shù)大全及其詳細(xì)說(shuō)明:
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á)式。
- 類(lèi)型:
String,默認(rèn)值為空字符串,表示使用服務(wù)器的默認(rèn)時(shí)區(qū)。 - 示例:
Asia/Shanghai
3. fixedRate
- 含義:指定任務(wù)以固定的時(shí)間間隔執(zhí)行,單位為毫秒。
- 類(lèi)型:
long,默認(rèn)值為-1,表示不使用固定速率。 - 示例:
@Scheduled(fixedRate = 5000)表示每隔 5 秒執(zhí)行一次
4. fixedRateString
- 含義:與
fixedRate類(lèi)似,但使用字符串類(lèi)型,支持占位符。 - 類(lèi)型:
String,默認(rèn)值為空字符串。 - 示例:
@Scheduled(fixedRateString = "5000")表示每隔 5 秒執(zhí)行一次
5. fixedDelay
- 含義:指定任務(wù)在上一次執(zhí)行結(jié)束后,經(jīng)過(guò)固定的時(shí)間間隔再執(zhí)行下一次,單位為毫秒。
- 類(lèi)型:
long,默認(rèn)值為-1,表示不使用固定延遲。 - 示例:
@Scheduled(fixedDelay = 5000)表示上一次任務(wù)執(zhí)行結(jié)束后,等待 5 秒再執(zhí)行下一次
6. fixedDelayString
含義:與 fixedDelay 類(lèi)似,但使用字符串類(lèi)型,支持占位符。
類(lèi)型:String,默認(rèn)值為空字符串。
示例:@Scheduled(fixedDelayString = "5000") 表示上一次任務(wù)執(zhí)行結(jié)束后,等待 5 秒再執(zhí)行下一次
7. initialDelay
- 含義:指定任務(wù)首次執(zhí)行前的延遲時(shí)間,單位為毫秒。
- 類(lèi)型:
long,默認(rèn)值為-1,表示不使用初始延遲。 - 示例:
@Scheduled(initialDelay = 5000, fixedRate = 10000)表示首次延遲 5 秒后執(zhí)行,之后每隔 10 秒執(zhí)行一次
8. initialDelayString
- 含義:與
initialDelay類(lèi)似,但使用字符串類(lèi)型,支持占位符。 - 類(lèi)型:
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í)行。
通過(guò)合理使用這些參數(shù),可以靈活地配置定時(shí)任務(wù)的執(zhí)行計(jì)劃,滿(mǎn)足各種業(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通過(guò)@Scheduled配置定時(shí)任務(wù)及定時(shí)任務(wù)@Scheduled注解的方法
- 詳解在Spring3中使用注解(@Scheduled)創(chuàng)建計(jì)劃任務(wù)
相關(guān)文章
JAVA異常處理機(jī)制之throws/throw使用情況
這篇文章主要介紹了JAVA異常處理機(jī)制之throws/throw使用情況的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java中的Reference和引用類(lèi)型實(shí)例精講
這篇文章主要為大家介紹了java中的Reference和引用類(lèi)型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java使用modbus4j實(shí)現(xiàn)modbus?tcp通訊
Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個(gè)品牌)在1979年發(fā)明的,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議,本文主要介紹了java如何使用modbus4j實(shí)現(xiàn)modbus?tcp通訊,感興趣的可以了解下2023-12-12
Springboot項(xiàng)目出現(xiàn)java.lang.ArrayStoreException的異常分析
這篇文章介紹了Springboot項(xiàng)目出現(xiàn)java.lang.ArrayStoreException的異常分析,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

