2012-08-01 184 views
4

背景:我在我的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" /> 

回答

1

好吧,我發現是的,的確,@Scheduled豆類是一個TimerManager線程池中的WebSphere 7

運行所有我需要做的就是吐出線程的堆棧跟蹤,看看它被稱爲的層次結構。

for(StackTraceElement element: Thread.currentThread().getStackTrace()) { 
    logger.debug(element.toString()); 
} 
0

閱讀Spring文檔,它看起來像你必須使用特定的TaskScheduler來在TimerManager線程池中運行 - TimerManagerTaskScheduler

<bean name="scheduler" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler"> 
... 
</bean> 

<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="threadTest" method="execute" fixed-delay="300000" /> 
</task:scheduled-tasks>