1. 程式人生 > >spring 定時任務執行兩次

spring 定時任務執行兩次

最近用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定時器下也會出現,解決方法也是如此,希望對各位大俠有所幫助。