背景: 我在我的 Websphere 7 应用程序中使用 Spring 3.0.x 来获取 CommonJ WorkManager 和 TimerManager。我使用它们在我部署的应用程序中以特定间隔执行任意任务。
问题:
我刚刚了解到,在调度程序中设置 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 中,它将ThreadTester
直接在 TimerManager 线程池中运行该类。这个线程池比 WorkManager 线程池具有更高的优先级(并且线程更少)。我希望线程与 WorkManager 一起运行,而不是具有适当的优先级并使用为线程设置的适当资源。
作为替代方案,我可以像这样@Scheduled
在类中使用 Spring 注释,而不是像上面那样在调度程序中设置 bean 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" />