背景: 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 を使用してスレッドを実行し、適切な優先順位でスレッド用に設定された適切なリソースを使用するようにします。
別の方法として、上記のようにスケジューラで Bean を設定する代わりに、次のようにクラスで 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" />