Spring 3.0 @Scheduled注释无法按预期工作

时间:2013-02-15 08:13:24

标签: spring spring-mvc scheduled-tasks scheduling spring-annotations

我使用@Scheduled注释在Spring MVC应用程序中创建函数myProcess()(在Apache Tomcat / 7.0.26上运行的版本3.0.6.RELEASE)每小时运行一次< / em>(3,600,000 ms = 1小时):

@Scheduled(fixedRate = 3600000)
public void myProcess() { ... }

该功能按预期执行,但不在早上执行(请参阅下面的示例日志时间最近2天)。这种情况每天都会发生我在日志文件中看不到任何异常。你对这种奇怪行为的原因有什么看法吗?


Feb 13 02:11:15
Feb 13 03:11:16 
Feb 13 06:17:34
Feb 13 06:45:55 
Feb 13 07:03:22
Feb 13 07:31:57
Feb 13 08:11:16 
Feb 13 09:11:18
Feb 13 10:11:18 
Feb 13 11:11:28 

Feb 14 01:11:37
Feb 14 02:11:29
Feb 14 03:11:29 
Feb 14 06:19:51
Feb 14 06:49:17
Feb 14 07:35:57
Feb 14 08:11:29
Feb 14 09:11:35

2 个答案:

答案 0 :(得分:2)

我不能给你一个特定问题的答案,我会尝试使用最新版本的Spring(3.2)因为在3.0和3.1之间,据我所知,在这个领域已经实现了重大变化。

然而,根据我的经验,我发现cronTrigger在所有情况下都要好得多(它当然可以完成fixedRate的所有功能)以及更多功能。

只需定义您的属性:

<util:properties id="props" location=classpath:/application.properties" />
<context:property-placeholder properties-ref="props"  />
<task:annotation-driven />

然后使用它:

@Scheduled(cron = "${cron.expression}")
public void scheduledTask() throws .. { .. }

在application.properties中你有类似的东西: cron.expression = 0 0/60 * * *?

答案 1 :(得分:2)

我遇到了同样的问题,但使用cron属性:

// every day at midnight
@Scheduled(cron = "0 0 0 * * ?")
public void myProcess() {
}

我真的不记得它的行为,但它不是我所期待的。我终于发现它可能取决于Spring 3.0.x中的一个错误。我尝试过(以及哪个有效)的解决方案是在 applicationContext.xml 文件中声明任务,除了注释

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    ...

    <!-- scheduling and async -->
    <task:annotation-driven />
    <task:scheduled-tasks>
      <task:scheduled ref="myProcessHandler" method="myProcess" fixed-delay="0" />
    </task:scheduled-tasks>
    <bean id="myProcessHandler" class="path.to.MyProcessHandler" />

    ...

</beans>

即使修复错误需要fixed-delay属性(据我所知),也不考虑,而cron属性@Scheduled注释是。

我希望这会有所帮助。