请考虑以下代码段:
@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>
答案 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指出这一点。