程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> spring中的定時調度實現TimerFactoryBean引起的隱患,timerfactorybean

spring中的定時調度實現TimerFactoryBean引起的隱患,timerfactorybean

編輯:JAVA綜合教程

spring中的定時調度實現TimerFactoryBean引起的隱患,timerfactorybean


手中的一個老項目,其中使用的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吧...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved