在Spring Web應用程序中,我有幾個DAO和服務層bean。一個服務層bean註釋了@Async/@Scheduled方法。這些方法依賴於其他(自動佈線)bean。 我已經配置了XML中的兩個線程池:如何在Web應用程序中的所有其他bean被銷燬之前關閉Spring任務執行程序/調度程序池?
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="2" />
<property name="maxPoolSize" value="5" />
<property name="queueCapacity" value="5" />
<property name="waitForTasksToCompleteOnShutdown" value="true" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
</property>
</bean>
<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="10" />
<property name="waitForTasksToCompleteOnShutdown" value="true" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
</property>
</bean>
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler"/>
一切按預期工作。我的問題是我無法完成關閉任務池的工作。這些任務在數據庫和文件系統上運行。當我停止Web應用程序時,需要一些時間直到它停止。這表明waitForTasksToCompleteOnShutdown
屬性起作用。但是,我在日誌中獲得IllegalStateExceptions,指出某些Bean已被銷燬,但某些工作任務線程仍在執行,並且因爲它們的依賴關係被破壞而失敗。
有一個JIRA問題,這可能是相關的:SPR-5387
我的問題是:有沒有辦法告訴Spring初始化任務執行/調度豆最後還是有辦法告訴Spring摧毀他們先?
我的理解是破壞發生在相反的初始順序。因此,最後發起的bean將首先被銷燬。如果線程池bean首先被銷燬,那麼所有當前正在執行的任務都將完成,並且仍然可以訪問相關的bean。
我也嘗試在線程池上使用depends-on屬性來引用具有@Async和@Scheduled註釋的我的服務bean。似乎他們從來沒有執行過,我沒有得到上下文初始化錯誤。我假設帶註釋的服務bean需要首先初始化這些線程池,如果我使用depends-on,則會顛倒順序並使它們不起作用。
可能這個崗位幫助?http://technicalmumbojumbo.wordpress.com/ 2011/04/13/spring-framework-an-introduction-part-ii-object-lifecycle-autowiring-internationalizationi18n /我不知道這是一個非常好的問題,我很好奇你如何解決這個問題...... –
謝謝。看到@ericacm的回答和我的評論。 – tvirtualw
我能夠通過簡單地註冊關機方法來解決這個問題在摧毀事件。以編程方式:http://docs.spring.io/spring/docs/3.2.0.RC1_to_3.2.0.RC2/changes/docdiffs_org.springframework.scheduling.annotation.html所以下面這個:如果你設置bean的destroy屬性關閉,事情應該工作 – hellojava