spring 定時任務執行兩次
阿新 • • 發佈:2019-01-03
最近用spring的quartz定時器的時候,發現到時間後,任務總是重複執行兩次,在tomcat或jboss下都如此。
打印出他們的hashcode,發現是不一樣的,也就是說,在web容器啟動的時候,重複啟了兩個quartz執行緒。
研究下來發現quartz確實會載入兩次:
第一次:web容器啟動的時候,讀取applicationContext.xml檔案時,會載入一次。
第二次:Spring本身會載入applicationContext.xml一次。
而我的quartz配置就是寫在applicationContext.xml檔案裡的。
解決辦法很簡單
先把quartz配置資訊提取出來,單獨存成一個檔案,比如applicationContext-quartz.xml
然後修改web.xml,讓web容器啟動時,可以載入該檔案
這樣quartz只會在web容器啟動時載入一次,Spring不會再載入了。
web.xml配置如下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml,/WEB-INF/classes/applicationContext-timertask.xml</param-value> </context-param> <!-- 開啟監聽 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
把定時器的配置單獨寫成一個配置檔案,在web容器啟動的時候只加載一次
這個問題在Spring的TimerTask定時器下也會出現,解決方法也是如此,希望對各位大俠有所幫助。