0

我已经看到有关 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 应该已经处理并消耗任何异常(如果有)。

如果有人对这里发生的事情有意见,真的很感激?

4

2 回答 2

0

我建议你使用 Quartz Scheduler 来实现 Spring Scheduler

http://quartz-scheduler.org/

于 2013-09-30T06:38:20.560 回答
0

1 jvm 有这个问题吗?

于 2013-10-01T14:05:33.093 回答