timertask の問題に関するさまざまなスレッドを見てきました。ただし、Spring Scheduler API (3.1) の内部作業について明確にしたいと思います。
10 秒ごとにタイマーを開始する必要があります。アプリケーションは、クラスター化された websphere zos で実行されます。(少なくとも 4 つの jvm ノード)。
こちらが配線。
<bean id="dataProcessSchedulerTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="ondataTransferTimerWakeupService" />
<property name="targetMethod" value="processDataFeedMetadata" />
</bean>
<bean id="DATA_PROCESS_TIMER"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="DATAProcessSchedulerTask" />
<property name="delay" value="#{systemProperties.DATA_PROCESS_TIMER}" />
<property name="period" value="#{systemProperties.DATA_PROCESS_TIMER}" />
</bean>
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
list>
<ref bean="DATA_PROCESS_TIMER" />
</list>
</property>
</bean>
<bean id="onDATATransferTimerWakeupService" class="com.serviceimpl.OnDATATransferTimerWakeupService" />
processDataFeedMetadata メソッドに (@async) を定義しました。
最初に 10 秒ごとに正しく起動するタイマー (4 つの jvm - 1 分ごとに 24 のタイマー発生) が見られる問題は、数時間後に誤動作を開始しました (2 つまたは 3 つの jvm がすべてのタイマーの起動を停止します - 毎回 6 ~ 12 のタイマー発生分)。timertask の実装には独自の制限があることを理解しています。ただし、MethodInvokingTimerTaskFactoryBean から ASYNC メソッドを呼び出すと、(1) タイマーが ASYNC メソッドを呼び出すとすぐに間隔内で完了する必要があるため、timertask が誤動作するのはなぜですか。(2) アプリのログから例外は見られず、MethodInvokingTimerTaskFactoryBean は例外があれば処理して消費する必要があります。
ここで何が起こっているかについて誰かが意見を持っていれば本当に感謝していますか?