サーブレット 3.0、Spring 3、およびその他のもので Java Web プロジェクトを構築しています。Spring の @Sheduled タスクを使用しようとしています。
正常に動作していますが、Tomcat から戦争をアンデプロイすると、スケジュールされたタスクが引き続き実行されます。Spring Container destroy で停止するにはどうすればよいですか?
更新 問題の根本原因を見つけました-Springコンテキストを2回インスタンス化しました。web.xml で初めて
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/servlet-context.xml
</param-value>
</context-param>
次のようなコードの2番目のもの:
context = new ClassPathXmlApplicationContext(new String[]
{"/WEB-INF/spring/servlet- context.xml", "/WEB-INF/spring/beans.xml"});
そのため、SheduledProcessor の 2 つのインスタンスが作成され、そのうちの 1 つが破棄されました。そのため、春は認識しているものを破壊し、2番目は実行を続け、何も破壊されていないと思います。ClassPathXmlApplicationContext を削除すると、問題が解決しました。
コントローラー.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");
}
}
spring-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>
ログファイル出力:
2013 年 7 月 3 日 11:32:34,436 [情報] (ScheduledProcessor.process:17)-> 処理タスク
11:33:04,439 [情報] (ScheduledProcessor.process:17)-> 処理タスク
2013 年 7 月 11:33:06,913 [情報] ] (XmlWebApplicationContext.doClose:1042)-> 名前空間 'Test-servlet' の WebApplicationContext を閉じています: 起動日 [2013 年 7 月 3 日水曜日 11:32:21 EEST]; コンテキスト階層のルート 2013 年 7 月 03 日 11:33:06,914 [INFO]
(DefaultListableBeanFactory.destroySingletons:444)-> org.springframework.beans.factory.support.DefaultListableBeanFactory@1a56058 でシングルトンを破棄: Bean の定義 [scheduledProcessor,receiverController,org. springframework.context.annotation.internalConfigurationAnnotationProcessor など。ファクトリ階層のルート **
2013 年 7 月 3 日 11:33:34,440 情報 -> 処理タスク
2013 年 7 月 3 日 12:34:0,440 情報 -> 処理タスク