手中的一個老項目,其中使用的TimerFactoryBean實現的調度任務.一般都是spring quartz實現,這種的著實少見.正因為少見資料比較少,當初為了確認這個會不會2個調度任務同時並行執行,還特意看過源碼,其中采用的jdk的Timer實現.也就是不會由於上一個任務沒執行就啟動下個任務的情況.
這個TimerFactoryBean通過引入ScheduledTimerTask來實現調度.大體的配置如下:
<bean id="myTask" class="xx.xx.MyTask" > <bean id="scheduleTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="delay" value="10000" /> <property name="period" value="10000" /> <property name="timerTask"> <ref local="myTask" /> </property> </bean> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduleTask1" /> </list> </property> </bean>
然後呢要是它一直穩定運行還好,可惜的是這個調度任務經常自己就掛掉了,消失了..第一印象是未捕獲異常,導致程序出錯退出,然後發現自定義代碼MyTask中已經全段catch了.然後還考慮過線程死鎖,排查過堆棧信息,折騰的好多次未果.
後來越來越覺得是這種實現本身有問題,然後對比spring的quartz實現做了測試,都拋出一個未捕獲的異常,然後發現spring quartz可以繼續執行下一次任務,而這個TimerFactoryBean已經掛掉了..由此推測這種實現的異常捕獲做的不好,由於各種原因它本身產生異常後會直接導致整個調度任務死掉..
總結:TimerFactoryBean的實現有缺陷,所以調度任務還是使用spring的quartz吧...