java – Spring webapp – 在应用程序停止时关闭线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring webapp – 在应用程序停止时关闭线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1697字,纯文字阅读大概需要3分钟。
内容图文
我使用Spring的ApplicationListener接口实例化ScheduledExecutorService,如下所示:
@Component
public class ExecutorsStart implements ApplicationListener<ContextRefreshedEvent> {
private ScheduledExecutorService executor;
@Autowired
Scheduler scheduler;
@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {
executor = Executors.newSingleThreadScheduledExecutor();
scheduler.init();
int delay = 10;
int period = 60;// repeat every 1 minutes.
executor.scheduleAtFixedRate(scheduler, delay, period, TimeUnit.SECONDS);
}
目前,当我运行./shutdown.sh时,Tomcat不会干净地关闭,并带有消息:
The web application [/foo] appears to have started a thread named [pool-1-thread-1] but has failed to stop it
这似乎是因为我还没有编写代码来停止ScheduledExecutorService.
我的问题是:在这种环境下如何正确地完成这项工作?
我注意到存在一个ContextStoppedEvent,所以,我为它实现了一个监听器:
@Component
public class ExecutorsStop implements ApplicationListener<ContextStoppedEvent> {
@Autowired
ExecutorsStart executorsStart;
@Override
public void onApplicationEvent(final ContextStoppedEvent event) {
executorsStart.executor.shutdownNow();
}
但是当Tomcat关闭时,似乎没有调用此事件处理程序.
我是否错误地实现了这个,或者我是否完全采用了这种方式?
解决方法:
您正在寻找ContextClosedEvent.
@Component
public class ExecutorsStop implements ApplicationListener<ContextClosedEvent> {
@Autowired
ExecutorsStart executorsStart;
@Override
public void onApplicationEvent(final ContextClosedEvent event) {
System.out.println("Stopped: " + event);
}
}
当Servlet容器关闭时,它会在其各种ServletContextListener上调用contextDestroyed(..)并在其Servlet实例上调用destroy(). ContextLoaderListener和DispatcherServlet分别在其ApplicationContext上调用close().
内容总结
以上是互联网集市为您收集整理的java – Spring webapp – 在应用程序停止时关闭线程全部内容,希望文章能够帮你解决java – Spring webapp – 在应用程序停止时关闭线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。