Spring实现 - 重复计时器

时间:2013-09-30 05:13:32

标签: java spring asynchronous timertask spring-scheduled

我在时间任务问题上看到过各种各样的话题。但是,我想对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应该已经处理并消耗任何异常(如果有的话)。

真的很感激,如果有人对这里发生的事情有所了解吗?

2 个答案:

答案 0 :(得分:0)

我建议您使用Quartz Scheduler进行Spring Scheduler实现

http://quartz-scheduler.org/

答案 1 :(得分:0)

1 jvm有这个问题吗?