Spring 3定时任务运行三次

9

我有一个非常简单的方法,计划每10秒运行一次,如下:

@Component
public class SimpleTask {

    @Scheduled(fixedRate=10000)
    public void first() {
        System.out.println("Simple Task  " + new Date());
    }
}

配置:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="5"  /> 
<task:scheduler id="myScheduler" pool-size="10"  />

我的问题是,我的方法每10秒钟被调用3次。它应该只被调用一次。我做错了什么? 我使用Spring Source ToolSuite和SpringSource tc Server 6。

3个回答

22

我曾遇到过这个问题。其中一个原因是Spring 3.0.0中存在的一个bug。我升级到3.0.5版本,重复问题就只剩下两次了。

另一个原因是我的类中有@Scheduled方法,而这个类被实例化了两次。这是因为上下文配置加载了两次。在web.xml文件中,我的ContextLoaderListener和DispatcherServlet指向同一个上下文配置文件:

...
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...

WEB-INF/applicationContext.xml 是 ContextLoaderListener 的默认上下文配置文件。因此,请确保您的 ContextLoaderListener 和 ServletDispatcher 使用不同的上下文文件。我最终创建了一个没有任何 bean 定义的 /WEB-INF/spring-servlet.xml 文件,并且它完美地工作了。


我也遇到了这个问题,我的servlet上下文xml文件被加载到servlet配置中,同时也有一个Spring Security配置。 - Dan

2
你把注释和配置混在一起了,我认为你不需要两者都用。

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace

从文档中:
注意:确保您在运行时不要初始化多个相同的@Scheduled注释类,除非您确实希望为每个这样的实例安排回调。与此相关的是,请确保不要对使用@Scheduled注释并作为常规Spring bean注册到容器的bean类使用@Configurable:否则您将获得双重初始化,一次通过容器,一次通过@Configurable方面,其结果是每个@Scheduled方法被调用两次。

1

可能你多次加载了应用程序上下文?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接