独自のスレッドを作成している場合は、おそらく問題です。アプリケーションサーバー内では、コンテナにスレッドプールを管理させ、実行する可能性のあるジョブをスケジュールする必要があります。
これをweb.xmlに追加します。
<resource-ref>
<res-ref-name>timer/MyTimer/res-ref-name>
<res-type>commonj.timers.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
applicationContext.xml(spring-context-support JARが必要):
<bean id="scheduler" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler" scope="singleton">
<property name="timerManagerName" value="java:comp/env/timer/MyTimer"/>
</bean>
次に、contextInitialized(...)で次のことを行います。
scheduledFuture = scheduler.schedule(new MyJob());
そして、あなたのコンテキストでは、Destroyed(...)do;
scheduledFuture.cancel(true);
私のプロジェクトでは、アプリケーションサーバーレベルでタイマーを構成することについて何も見つからないので、「正しく機能する」と思います。
(インターフェースを介して)非同期でジョブを生成する場合java.lang.concurrent.Executor
、手順は似ていますが、Weblogicでスレッドプールを構成する必要があります。
web.xml内;
<resource-ref>
<res-ref-name>wm/MyWorkManager</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
</resource-ref>
applicationContext.xmlの場合:
<bean id="executor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor" scope="singleton">
<property name="workManagerName" value="java:comp/env/wm/MyWorkManager"/>
</bean>
weblogic.xml(またはEARと同等のもの)では、次のようになります。
<work-manager>
<name>wm/MyWorkManager</name>
<min-threads-constraint>
<name>minThreads</name>
<count>1</count>
</min-threads-constraint>
<max-threads-constraint>
<name>maxThreads</name>
<count>20</count>
</max-threads-constraint>
</work-manager>
そしてあなたのコードでは:
executor.execute(new MyRunnable());
この特定のアプリサーバーのジョブスケジューリング関連情報の詳細については、タイマーとワークマネージャに関するWeblogicドキュメントをお読みください。