我正在Servlet 3.0,Spring 3和其他一些东西上构建Java Web Project。 我正在尝试使用Spring的@Sheduled任务 它工作正常,但当我从Tomcat取消部署战争时,计划任务继续运行。如何在Spring Container上阻止它?
更新 我发现问题的根源是什么 - 我实例化了Spring上下文两次。第一次在web.xml中作为
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/servlet-context.xml
</param-value>
</context-param>
和代码中的第二个:
context = new ClassPathXmlApplicationContext(new String[]
{"/WEB-INF/spring/servlet- context.xml", "/WEB-INF/spring/beans.xml"});
因此创建了两个SheduledProcessor实例,其中一个被销毁。所以春天摧毁了它所知道的一个,第二个继续运行让我认为没有任何东西被摧毁。 删除ClassPathXmlApplicationContext解决了我的问题。
Controller.java
package a.b.c;
imports...
@Controller
@RequestMapping("/")
public class ReceiverController {
@RequestMapping(method = RequestMethod.GET)
public String welcome(ModelMap model) {
new ClassPathXmlApplicationContext("config.xml", ReceiverController.class);
return "index";
}
}
的 ScheduledProcessor.java
package a.b.c;
imports..
@Service
public class ScheduledProcessor {
private Logger logger = LoggerFactory.getLogger(ScheduledProcessor.class);
@Scheduled(fixedDelay = 30000)
public void process() {
logger.info("Processing task");
}
}
的弹簧-config.xml中
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="a.b.c"/>
<task:annotation-driven/>
</beans>
日志文件输出:
03 Jul 2013 11:32:34,436 [INFO](ScheduledProcessor.process:17) - &gt;处理任务
11:33:04,439 [INFO](ScheduledProcessor.process:17) - &gt;处理任务
2013年7月11:33:06,913 [INFO](XmlWebApplicationContext.doClose:1042) - &gt;闭幕 命名空间'Test-servlet'的WebApplicationContext:启动日期[Wed 7月03日11:32:21 EEST 2013];上下文层次结构根据2013年7月3日 11:33:06,914 [INFO]
(DefaultListableBeanFactory.destroySingletons:444) - &GT;销毁 单身人士 org.springframework.beans.factory.support.DefaultListableBeanFactory@1a56058: 定义bean [scheduledProcessor,receiverController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor等。; 工厂层级的根 **
2013年7月3日11:33:34,440 INFO - &gt;处理任务
2013年7月3日12:34:0,440 INFO - &gt;处理任务