我已经看到有关 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 - 每分钟 24 个计时器发生),几个小时后开始出现异常行为(2 或 3 个 jvm 完全停止触发任何计时器 - 6 到 12 个计时器发生每分钟)。我了解 timertask 实现有其自身的限制。但是,如果我从 MethodInvokingTimerTaskFactoryBean 调用 ASYNC 方法,为什么 timertask 行为不当,因为 (1) timer 应该在调用 ASYNC 方法后立即在间隔内完成。(2) 我没有从应用程序日志中看到任何异常,并且 MethodInvokingTimerTaskFactoryBean 应该已经处理并消耗任何异常(如果有)。
如果有人对这里发生的事情有意见,真的很感激?