Spring Scheduling:@Scheduled注释用@Controller注释的类内部的方法运行两次

时间:2015-07-30 13:18:24

标签: java spring spring-mvc scheduler

请考虑以下代码段:

@Controller
public class RestController {

    @Scheduled(cron = "0 0 */* * * ?") // run every hour
    public void runMeHourly() {
        LOGGER.debug("RestController#runMeHourly triggered to run at: " + System.currentTimeMillis());

        // Do your hourly work here
    }


}

当我在J2EE Web服务器中部署此控制器时,我发现每小时触发两次方法RestController#runMeHourly()

我在spring docs scheduling找到了对此类内容的引用。

它说:

  

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

这有关系吗?这是否意味着我需要在runMeHourly()

之外安排方法RestController

[编辑1:看起来@Configurable是其他东西,并没有导致问题,我没有在任何地方使用它。所以必须有其他原因导致这种行为]

[编辑2:

我的web.xml:

<web-app>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>com.company.module.ModuleContextListener</listener-class>
    </listener>

</web.xml>

mvc-dispatcher-servlet.xml

<beans>

    <mvc:annotation-driven />

    <task:annotation-driven />

    <context:component-scan base-package="com.company" />

    <import resource="module/module-servlet.xml"/>

</beans>

模块/模块servlet.xml中

<beans>

    <context:component-scan base-package="com.company.module"/>

</beans>

1 个答案:

答案 0 :(得分:0)

com.company.module.ModuleContextListener强制DispatcherServlet查找根应用程序上下文,并且由于根应用程序上下文与mvc-dispatcher-servlet.xml相同,因此它被加载两次。一次作为根上下文,再次在DispatcherServlet下,名称为mvc-dispatcher

将根上下文xml mvc-dispatcher-servlet.xml重命名为applicationContext.xml并添加空mvc-dispatcher-servlet.xml解决问题。

感谢@ 6ton指出这一点。