我在时间任务问题上看到过各种各样的话题。但是,我想对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分钟 - 每分钟发生4次定时器),几小时后开始行为不端(2或3个jvms停止发射任何定时器 - 6到12计时器每分钟发生一次)。我理解timertask实现有它自己的局限性。但是,如果我从MethodInvokingTimerTaskFactoryBean调用ASYNC方法,为什么timertask会错误地为 (1)一旦调用ASYNC方法,定时器应在该间隔内完成。 (2)我没有看到应用程序日志中的任何异常,并且MethodInvokingTimerTaskFactoryBean应该已经处理并消耗任何异常(如果有的话)。
真的很感激,如果有人对这里发生的事情有所了解吗?
答案 0 :(得分:0)
我建议您使用Quartz Scheduler进行Spring Scheduler实现
答案 1 :(得分:0)
1 jvm有这个问题吗?