背景:我在我的Websphere 7應用程序中使用Spring 3.0.x來獲取CommonJ WorkManager和TimerManager。我使用這些在我部署的應用程序中以特定間隔執行任意任務。使Spring任務與任務執行器線程一起運行
問題:
我剛剛得知,像這樣的調度設置一個bean時:
<bean id="threadTest" class="test.ThreadTester" />
<task:scheduled-tasks scheduler="myTimerExecutor">
<task:scheduled ref="threadTest" method="execute" fixed-delay="300000" />
</task:scheduled-tasks>
在WebSphere中,它會直接在一個TimerManager線程池中運行ThreadTester
類。此線程池與WorkManager線程池相比具有更高的優先級(並且線程更少)。我希望線程能夠與WorkManager一起運行,而不是處於適當的優先級,並使用爲線程設置的適當資源。
作爲替代方案,而不是像上面的調度設置豆,我可以使用Spring @Scheduled
標註在ThreadTester
類,像這樣:
@Scheduled(fixedDelay = 300000)
public void execute() {
...
}
問:
是否使用@Scheduled
批註使計劃的類在TimerManager線程池或WorkManager線程池中運行?
如果它使用WorkManager運行,那麼太棒了!這解決了我的問題。但是,如果它使用TimerManager直接執行該類,那麼我想我必須編寫一些包裝才能正確調用WorkManager。
感謝您的幫助!
編輯:在這裏,我有我如何設置調度和執行與WebSphere 7 commonj實現:
<bean id="myTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
<property name="resourceRef" value="true"/>
</bean>
<bean id="myTaskScheduler" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler">
<property name="timerManagerName" value="tm/default" />
<property name="resourceRef" value="true" />
<property name="shared" value="false" />
</bean>
<task:annotation-driven executor="myTaskExecutor" scheduler="myTaskScheduler" />