2012-08-01 152 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>