天天看點

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

情景:在使用SpringMVC的定時任務的注解時,發現自己的定時任務會重複執行倆次。這是為什麼呢?

java代碼:

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

spring-mvc.xml配置:

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法
mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

這樣配置完後,在啟動項目後,項目便能按照指定的時間,間隔半小時執行一次。任務是沒半小時執行了,但是每次會重複倆次插入操作。這讓我有些費解了。我上網搜尋了一下類似的情況的前輩們的解決方法,然後才知道原因。

原因:

任務在同一時刻執行了倆次,說明這個任務執行個體化了倆次。我看到網上大多數都是寫的原因都是因為SpringMVC的配置檔案,因為在web.xml中也引入了該檔案而被執行個體化了倆次。原文如下:

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

但是我總是覺得這個理由不适合我的情況。如果是因為在web中配置而導緻執行個體化了倆次的話,那麼其他的用@Component等注解的類,不也會執行個體化倆次嗎?但是我并沒有發現其重複執行個體化的現象。那麼說明,我的項目程式的配置沒有問題。那麼是什麼原因導緻我的定時任務被執行個體化了倆次呢?偶然間看到一個微網誌上寫的,如果太多配置寫在一個.xml檔案中,會導緻在掃描的時候,重複執行個體化。原作者語言如下:(以作日後參考)

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

偶然間我滑鼠放在了配置檔案的一個标簽component-scan屬性上,我恍然大悟:

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法
mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

component-scan:掃描标簽會自動将擁有@Component注解的類執行個體化為Bean,而在我定義的任務類上恰好有這麼個标簽!而在項目中,這個标簽早就已經引入使用了,而我再定義了一個,那麼就相當于将擁有@Component注釋的類執行個體化了倆次。即使掃描的包不同,但是先前定義的掃描範圍可是整個項目的。這樣一來,我的這個任務類相當于被執行個體化了倆次。那麼,直接把這個掃描配置删了,不就成了?

解決:

我直接将配置檔案中我自己定義的那個自動掃描包的配置:

mysql定時任務怎麼會執行兩次_定時任務會重複執行倆次的解決方法

删除,然後測試,果然,任務隻執行了一次。到此,問題解決!

參考來源:

總結:

雖然在開發的時候用springMVC用的很多,但是對于spring的種種功能和配置,我還是很糊塗的。這也說明了我springMVC基礎知識的薄弱性。springMVC的學習有待加強啊!

解決此類問題:

1)看配置檔案是否有問題:這裡的配置檔案指的是web.xml和spring-mvc間的配置,是否會導緻執行個體化重複,如果有,就直接修改配置就行;

2)除開1)的情形,即web配置不會導緻重複執行個體化的話,那麼就看spring-mvc.xml中的掃描配置是否有重疊的地方,如果有,将重疊的地方去掉就行。