Spring定時(shí)器在同一時(shí)間重復(fù)執(zhí)行兩次
Spring定時(shí)器在同一時(shí)間重復(fù)執(zhí)行兩次
解決方案如下:
最近用Spring的quartz定時(shí)器的時(shí)候,發(fā)現(xiàn)到時(shí)間后,任務(wù)總是重復(fù)執(zhí)行兩次,在tomcat或jboss下都如此。
打印出他們的hashcode,發(fā)現(xiàn)是不一樣的,也就是說(shuō),在web容器啟動(dòng)的時(shí)候,重復(fù)啟了兩個(gè)quartz線程。
研究下來(lái)發(fā)現(xiàn)quartz確實(shí)會(huì)加載兩次:
第一次:web容器啟動(dòng)的時(shí)候,讀取applicationContext.xml文件時(shí),會(huì)加載一次。
第二次:Spring本身會(huì)加載applicationContext.xml一次。
而我的quartz配置就是寫(xiě)在applicationContext.xml文件里的。
解決辦法很簡(jiǎn)單
先把quartz配置信息提取出來(lái),單獨(dú)存成一個(gè)文件,比如applicationContext-quartz.xml
然后修改web.xml,讓web容器啟動(dòng)時(shí),可以加載該文件
這樣quartz只會(huì)在web容器啟動(dòng)時(shí)加載一次,Spring不會(huì)再加載了。
web.xml配置如下:
contextConfigLocation
/WEB-INF/classes/applicationContext.xml,/WEB-INF/classes/applicationContext-timertask.xml
org.springframework.web.context.ContextLoaderListener
把定時(shí)器的配置單獨(dú)寫(xiě)成一個(gè)配置文件,在web容器啟動(dòng)的時(shí)候只加載一次
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。