關於@Scheduled不執行的原因分析
@Scheduled不執行的原因
1. 今天用@Schedule做瞭一個定時任務
希望凌晨1點執行,代碼如下
@Service public class ParseJsonService { @Scheduled(cron = "0 0 1 * * ?") public void parseMongodbDataToJson() { } }
第二天來公司瞭,發現根本沒有執行。然後開始查找問題
2. 首先遇到查到的一個解決方案
說是spring的版本的問題,我看瞭下我以前用的定時任務,的確spring用的是4. 於是我將spring的版本換成瞭4,發現還是不好使
3. 還有版本說要在spring
的配置文件中加上註解驅動
<task:annotation-driven />
並且還要加上default-lazy-init=”false”屬性,說是不讓spring懶加載,但是發現還是不行
4. 又查到版本說要在Bean上加上@Lazy(false)
讓spring對該Bean在啟動的時候就加載,但是發現還是不行
終極解決方案(適合我,不一定適合你, 我用的Spring版本是3,不是4)
第一步:在spring的配置文件中加上
<task:annotation-driven />
第二步:在上述Bean上加上
@EnableScheduling
代碼如下:
@Service @EnableScheduling public class ParseJsonService { @Scheduled(cron = "0 0 1 * * ?") public void parseMongodbDataToJson() { } }
@Scheduled不生效的排查記錄
@Scheduled 不生效的排查記錄
公司之前項目要加個定時處理,覺得so easy。
<!-- 開啟定時任務 --> <task:annotation-driven /> <!-- 開啟註解 --> <context:annotation-config /> <!-- 指定相關的包路徑 --> <context:component-scan base-package="com.ffrj.schedule"/>
@Component public class CommonSchedule { //@Scheduled(cron = "0 0 1 * * ?") @Scheduled(cron = "*/5 * * * * ?") public void avg() { System.out.println("現在開始計算平均值 當前時間為"); } }
本以為就搞定瞭 ,發現不生效!!!
開始網上查詢資料。
@EnableScheduling
也加瞭 不生效!@Lazy(false)
也加瞭 不生效!!
開始有點慌瞭,看瞭下包路徑 沒問題啊 ,想著用xml 配一遍
<task:annotation-driven /> <bean id="myTaskXml" class="com.ffrj.schedule.CommonSchedule "></bean> <task:scheduled-tasks> <task:scheduled ref="myTaskXml" method="show" cron="*/5 * * * * ?" /> </task:scheduled-tasks> <context:component-scan base-package="com.ffrj.schedule" />
發現還是不生效!!!!!!!
這時候前端訪問瞭一下我的接口 ,看瞭看log ,臥槽 system 打印瞭 !!!
冷靜瞭一下
@Lazy(false) 不生效??沒道理啊 然後開始翻配置文件看是不是有些bean 添加 default-lazy-init=“true” 屬性瞭 ,也沒有啊。
最後發現 :
不知道哪位奇葩 把這行給註掉瞭。
果斷取消註釋 解決問題。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 關於@Scheduled註解的任務為什麼不執行的問題
- Spring Schedule Task動態改寫Cron配置方式
- java使用@Scheduled註解執行定時任務
- Java @Scheduled定時器用法解析
- SpringBoot整合定時任務之實現Scheduled註解的過程(一個註解全解決)