SpringBoot之@Scheduled注解用法解讀
SpringBoot之@Scheduled注解用法
@Scheduled 是 Spring Framework 中用于實現(xiàn)定時任務的核心注解,能夠方便地配置方法在特定時間或周期執(zhí)行。
以下是詳細解析:
1. 啟用定時任務
在 Spring Boot 中,需在配置類添加 @EnableScheduling 注解以啟用定時任務支持:
@Configuration @EnableScheduling public class AppConfig { }
2. 基本用法
直接在方法上添加 @Scheduled
注解,并配置執(zhí)行規(guī)則:
@Component public class ScheduledTasks { // 固定延遲(任務結束后的間隔) @Scheduled(fixedDelay = 5000) public void taskWithFixedDelay() { // 每隔5秒執(zhí)行一次(任務完成后開始計時) } // 固定速率(任務開始的間隔) @Scheduled(fixedRate = 3000) public void taskWithFixedRate() { // 每隔3秒執(zhí)行一次(任務開始后開始計時) } // 初始延遲(首次執(zhí)行前的等待時間) @Scheduled(initialDelay = 10000, fixedRate = 5000) public void taskWithInitialDelay() { // 首次延遲10秒,之后每隔5秒執(zhí)行一次 } // Cron表達式(復雜時間規(guī)則) @Scheduled(cron = "0 0 12 * * ?") public void taskWithCronExpression() { // 每天中午12點執(zhí)行 } }
3. 參數(shù)詳解
(1) fixedDelay
- 作用:任務結束后的固定延遲時間(單位:毫秒)。
- 示例:@Scheduled(fixedDelay = 5000) 表示任務結束后等待5秒再執(zhí)行下一次。
- 適用場景:需確保前一次任務完成后再執(zhí)行下一次。
(2) fixedRate
- 作用:任務開始的固定時間間隔(單位:毫秒)。
- 示例:@Scheduled(fixedRate = 3000) 表示每隔3秒執(zhí)行一次(無論前一次任務是否完成)。
- 注意:若任務執(zhí)行時間超過間隔時間,可能導致任務重疊(需結合線程池配置)。
(3) initialDelay
- 作用:首次任務執(zhí)行前的初始延遲時間(單位:毫秒)。
- 示例:@Scheduled(initialDelay = 10000, fixedRate = 5000) 表示首次延遲10秒后執(zhí)行,之后每隔5秒執(zhí)行一次。
(4) cron
- 作用:通過 Cron 表達式定義復雜調度規(guī)則。
- Cron 表達式格式:秒 分 時 日 月 周 年(可選)
- 常用示例:
- 0 0 10 * * ?:每天上午10點執(zhí)行。
- 0 0/5 14 * * ?:每天下午2點開始,每隔5分鐘執(zhí)行一次。
- 0 15 10 ? * MON-FRI:每周一至周五上午10:15執(zhí)行。
- 在線工具:推薦使用 Cron表達式生成器。
4. 線程池配置
默認情況下,定時任務使用單線程執(zhí)行。若任務耗時較長,需配置線程池避免阻塞:
@Configuration public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod = "shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(10); // 自定義線程數(shù) } }
5. 注意事項
1. 避免長時間阻塞:若任務執(zhí)行時間超過調度間隔,需合理設計邏輯或配置線程池。
2. 分布式環(huán)境問題:在集群中,定時任務可能被多個實例重復執(zhí)行。解決方案:
- 使用分布式鎖(如 Redis 或 ZooKeeper)。
- 通過數(shù)據(jù)庫唯一標識控制任務執(zhí)行。
3. 動態(tài)調整:默認 @Scheduled 參數(shù)不支持動態(tài)修改。如需動態(tài)調度,可結合 ScheduledTaskRegistrar 或使用 Quartz 框架。
6. 常見問題
Q1:Cron 表達式中的 ? 和 * 有什么區(qū)別?
*
表示任意值(如:*
在“日”字段表示每天)。?
用于“日”和“周”字段的互斥條件(避免沖突)。
Q2:如何避免任務重復執(zhí)行?
- 單機環(huán)境:確保任務冪等性。
- 分布式環(huán)境:使用分布式鎖或數(shù)據(jù)庫唯一約束。
Q3:如何調試定時任務?
- 開啟 Spring 的調試日志:logging.level.org.springframework.scheduling=DEBUG
總結
@Scheduled 是 Spring 中實現(xiàn)定時任務的便捷工具,通過靈活配置 fixedDelay、fixedRate 或 cron 表達式,可以滿足大多數(shù)調度需求。
在復雜場景(如動態(tài)任務或分布式環(huán)境)中,可結合 Quartz 或其他分布式調度框架實現(xiàn)更高級功能。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JVM?運行時數(shù)據(jù)區(qū)與JMM?內存模型
這篇文章主要介紹了JVM?運行時數(shù)據(jù)區(qū)與JMM?內存模型,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值。需要的朋友可以參考一下2022-07-07SpringBoot靜態(tài)資源CSS等修改后再運行無效的解決
這篇文章主要介紹了SpringBoot靜態(tài)資源CSS等修改后再運行無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12