4

背景: 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" /> 
4

2 に答える 2

2

はい、確かに、@ScheduledBean は Websphere 7 の TimerManager スレッド プール内で実行されることがわかりました。

私がしなければならなかったのは、スレッドのスタック トレースを吐き出して、スレッドが呼び出された階層を確認することだけでした。

for(StackTraceElement element: Thread.currentThread().getStackTrace()) {
    logger.debug(element.toString());
}
于 2012-08-23T18:15:32.780 に答える
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>
于 2012-08-06T19:15:43.330 に答える