最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 中 @Scheduled 定時(shí)任務(wù)不生效的原因及解決方法

 更新時(shí)間:2025年11月29日 14:22:16   作者:倒鉤  
SpringBoot中@Scheduled注解用于創(chuàng)建定時(shí)任務(wù),但有時(shí)任務(wù)可能不生效,本文介紹Spring Boot 中 @Scheduled 定時(shí)任務(wù)不生效的原因及解決方法,感興趣的朋友跟隨小編一起看看吧

一、引言

在 Spring Boot 開發(fā)中,@Scheduled注解為開發(fā)者提供了一種簡單便捷的方式來實(shí)現(xiàn)定時(shí)任務(wù)。通過該注解,我們可以輕松地配置任務(wù)按照固定速率、固定延遲或者基于 Cron 表達(dá)式等方式執(zhí)行。然而,在實(shí)際開發(fā)過程中,有時(shí)會(huì)遇到定時(shí)任務(wù)不生效的情況,這給開發(fā)和運(yùn)維帶來了很大的困擾。從源碼層面深入分析定時(shí)任務(wù)不生效的原因,有助于我們更好地理解 Spring Boot 定時(shí)任務(wù)的運(yùn)行機(jī)制,從而快速定位和解決問題。

二、@Scheduled 注解基礎(chǔ)

(一)@Scheduled 注解的定義與功能

@Scheduled注解是 Spring 框架提供的用于創(chuàng)建定時(shí)任務(wù)的注解,它位于org.springframework.scheduling.annotation包下。該注解支持多種定時(shí)任務(wù)配置方式,常見的有:

  • fixedRate:指定任務(wù)執(zhí)行的固定速率,即任務(wù)開始執(zhí)行的時(shí)間間隔是固定的。
  • fixedDelay:指定任務(wù)執(zhí)行完成后,下一次任務(wù)開始執(zhí)行的延遲時(shí)間。
  • cron:使用 Cron 表達(dá)式來精確控制任務(wù)的執(zhí)行時(shí)間。

(二)使用示例

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTask {
    @Scheduled(fixedRate = 5000)
    public void scheduledTask() {
        System.out.println("定時(shí)任務(wù)執(zhí)行了:" + System.currentTimeMillis());
    }
}

在上述示例中,scheduledTask方法會(huì)每隔 5 秒執(zhí)行一次。

三、定時(shí)任務(wù)的啟動(dòng)流程源碼分析

(一)Spring Boot 啟動(dòng)過程

1. SpringApplication 啟動(dòng)

SpringApplication 的run方法是 Spring Boot 應(yīng)用啟動(dòng)的入口。以下是其主要步驟:

  • 創(chuàng)建 SpringApplication 實(shí)例:根據(jù)應(yīng)用的類型(Web 應(yīng)用或非 Web 應(yīng)用)進(jìn)行不同的初始化操作。
  • 加載配置源:加載各種配置源,包括屬性文件、命令行參數(shù)等。
  • 創(chuàng)建 Spring 上下文:創(chuàng)建一個(gè) Spring 上下文(ApplicationContext),在創(chuàng)建過程中,會(huì)進(jìn)行一系列的初始化工作,如加載 Bean 定義、實(shí)例化 Bean 等。
    在啟動(dòng)過程中,Spring 會(huì)通過組件掃描機(jī)制掃描帶有@Scheduled注解的組件。具體來說,依賴于 Spring 的ClassPathBeanDefinitionScanner類,它會(huì)遍歷指定的包路徑,查找?guī)в邢鄳?yīng)注解的類,并將其定義為BeanDefinition,然后注冊(cè)到容器中。
2. 定時(shí)任務(wù)相關(guān)配置加載

Spring Boot 在啟動(dòng)過程中,會(huì)通過自動(dòng)配置機(jī)制加載與定時(shí)任務(wù)相關(guān)的配置類,其中SchedulingConfiguration是一個(gè)關(guān)鍵的配置類。自動(dòng)配置是通過@EnableAutoConfiguration注解觸發(fā)的,Spring Boot 會(huì)根據(jù)類路徑下的依賴和配置情況,自動(dòng)選擇并加載相應(yīng)的配置類。
SchedulingConfiguration類中,會(huì)初始化定時(shí)任務(wù)執(zhí)行器(TaskScheduler)等相關(guān)組件。默認(rèn)情況下,會(huì)創(chuàng)建一個(gè)ThreadPoolTaskScheduler實(shí)例作為定時(shí)任務(wù)的執(zhí)行器。初始化過程會(huì)設(shè)置執(zhí)行器的一些參數(shù),如核心線程數(shù)、最大線程數(shù)等,這些參數(shù)會(huì)影響定時(shí)任務(wù)的執(zhí)行性能和并發(fā)處理能力。

(二)@Scheduled 注解的解析

1. BeanPostProcessor 機(jī)制

Spring 的BeanPostProcessor是一個(gè)接口,實(shí)現(xiàn)該接口的類可以在 Bean 初始化前后進(jìn)行額外的處理。在 Bean 實(shí)例化后,在調(diào)用其初始化方法之前,會(huì)調(diào)用postProcessBeforeInitialization方法;在初始化方法調(diào)用之后,會(huì)調(diào)用postProcessAfterInitialization方法。
ScheduledAnnotationBeanPostProcessor負(fù)責(zé)處理@Scheduled注解。它會(huì)在 Bean 初始化后,檢查 Bean 上是否帶有@Scheduled注解,如果有,則對(duì)注解進(jìn)行解析和處理。

2. 解析 @Scheduled 注解

ScheduledAnnotationBeanPostProcessorpostProcessAfterInitialization方法中,會(huì)遍歷 Bean 的所有方法,查找?guī)в?code>@Scheduled注解的方法。對(duì)于找到的方法,會(huì)獲取注解的屬性值,如 cron 表達(dá)式、固定延遲時(shí)間等,并根據(jù)這些屬性值創(chuàng)建相應(yīng)的ScheduledTask對(duì)象。然后,將這些任務(wù)注冊(cè)到TaskScheduler中,由TaskScheduler負(fù)責(zé)按照配置的時(shí)間規(guī)則執(zhí)行任務(wù)。

四、定時(shí)任務(wù)不生效的可能原因及源碼分析

(一)未啟用定時(shí)任務(wù)功能

1. 原因分析

在 Spring Boot 中,要使用@Scheduled注解,必須在主應(yīng)用類上添加@EnableScheduling注解來啟用定時(shí)任務(wù)功能。如果忘記添加該注解,Spring Boot 不會(huì)對(duì)@Scheduled注解進(jìn)行解析和處理,導(dǎo)致定時(shí)任務(wù)無法生效。

2. 源碼依據(jù)

@EnableScheduling注解會(huì)導(dǎo)入SchedulingConfiguration配置類,該配置類是定時(shí)任務(wù)功能的核心配置。如果沒有導(dǎo)入該配置類,定時(shí)任務(wù)相關(guān)的組件(如TaskScheduler)不會(huì)被初始化,ScheduledAnnotationBeanPostProcessor也不會(huì)起作用。

(二)定時(shí)任務(wù)執(zhí)行器配置問題

1. 原因分析

如果定時(shí)任務(wù)執(zhí)行器(TaskScheduler)的配置不合理,可能會(huì)導(dǎo)致任務(wù)無法按時(shí)執(zhí)行。例如,核心線程數(shù)設(shè)置過小,當(dāng)有多個(gè)定時(shí)任務(wù)需要執(zhí)行時(shí),可能會(huì)出現(xiàn)線程不足的情況,導(dǎo)致部分任務(wù)被阻塞。

2. 源碼依據(jù)

SchedulingConfiguration類中,會(huì)創(chuàng)建ThreadPoolTaskScheduler實(shí)例,并設(shè)置其核心線程數(shù)等參數(shù)。如果參數(shù)設(shè)置不合理,會(huì)影響任務(wù)的執(zhí)行。例如,當(dāng)任務(wù)提交到ThreadPoolTaskScheduler時(shí),如果核心線程都在忙碌,且任務(wù)隊(duì)列已滿,新的任務(wù)可能會(huì)被丟棄或者等待執(zhí)行。

(三)Cron 表達(dá)式錯(cuò)誤

1. 原因分析

如果使用cron屬性配置定時(shí)任務(wù),Cron 表達(dá)式書寫錯(cuò)誤會(huì)導(dǎo)致任務(wù)無法按照預(yù)期時(shí)間執(zhí)行。例如,Cron 表達(dá)式中的時(shí)間字段格式不正確,或者時(shí)間范圍超出了合法范圍。

2. 源碼依據(jù)

ScheduledAnnotationBeanPostProcessor解析@Scheduled注解時(shí),會(huì)對(duì) Cron 表達(dá)式進(jìn)行解析。如果表達(dá)式錯(cuò)誤,會(huì)拋出IllegalArgumentException異常,導(dǎo)致任務(wù)無法正確注冊(cè)到TaskScheduler中。

(四)任務(wù)執(zhí)行異常

1. 原因分析

如果定時(shí)任務(wù)方法內(nèi)部拋出異常,且沒有進(jìn)行適當(dāng)?shù)漠惓L幚?,可能?huì)導(dǎo)致任務(wù)停止執(zhí)行。例如,任務(wù)方法中訪問數(shù)據(jù)庫時(shí)出現(xiàn)連接異常,而沒有捕獲該異常,會(huì)導(dǎo)致任務(wù)終止。

2. 源碼依據(jù)

當(dāng)TaskScheduler執(zhí)行定時(shí)任務(wù)時(shí),如果任務(wù)方法拋出異常,異常會(huì)被捕獲并記錄日志。如果沒有對(duì)異常進(jìn)行處理,任務(wù)將不會(huì)繼續(xù)執(zhí)行,除非配置了重試機(jī)制。

五、總結(jié)

通過對(duì) Spring Boot 中定時(shí)任務(wù)啟動(dòng)流程的源碼分析,我們可以看到定時(shí)任務(wù)不生效可能是由多種原因?qū)е碌?。在開發(fā)過程中,我們需要確保正確啟用定時(shí)任務(wù)功能,合理配置定時(shí)任務(wù)執(zhí)行器,檢查 Cron 表達(dá)式的正確性,并對(duì)任務(wù)方法中的異常進(jìn)行適當(dāng)處理。這樣才能保證定時(shí)任務(wù)能夠穩(wěn)定、按時(shí)地執(zhí)行。

到此這篇關(guān)于Spring Boot 中 @Scheduled 定時(shí)任務(wù)不生效的原因及解決方法的文章就介紹到這了,更多相關(guān)Spring Boot @Scheduled 定時(shí)任務(wù)不生效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Protostuff序列化和反序列化的使用說明

    Protostuff序列化和反序列化的使用說明

    今天小編就為大家分享一篇關(guān)于Protostuff序列化和反序列化的使用說明,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • java 動(dòng)態(tài)增加定時(shí)任務(wù)示例

    java 動(dòng)態(tài)增加定時(shí)任務(wù)示例

    本篇文章主要介紹了java 動(dòng)態(tài)增加定時(shí)任務(wù)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java 枚舉的基本使用方法及實(shí)際使用場(chǎng)景

    Java 枚舉的基本使用方法及實(shí)際使用場(chǎng)景

    枚舉是 Java 中一種特殊的類,用于定義一組固定的常量,枚舉類型提供了更好的類型安全性和可讀性,適用于需要定義一組有限且固定的值的場(chǎng)景,本文給大家介紹Java 枚舉的用法及實(shí)際使用場(chǎng)景,感興趣的朋友一起看看吧
    2025-06-06
  • Java連接MQ實(shí)現(xiàn)信息查詢的操作過程

    Java連接MQ實(shí)現(xiàn)信息查詢的操作過程

    本文介紹了如何使用Java連接ApacheRocketMQ實(shí)現(xiàn)信息查詢的功能,通過編寫Java代碼連接MQ并實(shí)現(xiàn)生產(chǎn)者發(fā)送消息和消費(fèi)者接收并處理消息的過程,展示了如何在分布式系統(tǒng)中實(shí)現(xiàn)訂單處理系統(tǒng)的解耦,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Spring & Spring Boot 常用注解整理收藏

    Spring & Spring Boot 常用注解整理收藏

    注解就像代碼里的便利貼,用來告訴 Spring 框架:這個(gè)類/方法/變量有什么特殊用途,本文分步驟給大家介紹Spring & Spring Boot 常用注解整理,感興趣的朋友一起看看吧
    2025-05-05
  • 詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入

    詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入

    這篇文章主要介紹了詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 詳解IDEA多module項(xiàng)目maven依賴的一些說明

    詳解IDEA多module項(xiàng)目maven依賴的一些說明

    這篇文章主要介紹了詳解IDEA多module項(xiàng)目maven依賴的一些說明,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓栴}復(fù)盤

    MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓栴}復(fù)盤

    這篇文章主要介紹了MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓栴}復(fù)盤,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報(bào)錯(cuò)問題解決辦法

    關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報(bào)錯(cuò)問題解

    這篇文章主要給大家介紹了關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報(bào)錯(cuò)問題的解決辦法,這個(gè)是在pom文件中添加依賴出現(xiàn)報(bào)錯(cuò)問題,需要的朋友可以參考下
    2024-02-02
  • java編寫冒泡排序的完整示例

    java編寫冒泡排序的完整示例

    這篇文章主要給大家介紹了關(guān)于java編寫冒泡排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論

海安县| 策勒县| 怀柔区| 兴隆县| 丘北县| 缙云县| 阳泉市| 牟定县| 扬中市| 望谟县| 墨竹工卡县| 石嘴山市| 黑山县| 江津市| 南投县| 左权县| 青阳县| 十堰市| 吉安县| 濮阳市| 陇川县| 英超| 元朗区| 扎囊县| 忻城县| 武平县| 达拉特旗| 二手房| 开化县| 四子王旗| 昆山市| 和静县| 喜德县| 义乌市| 宜君县| 禄劝| 南部县| 四平市| 盐亭县| 偏关县| 长岭县|