Tomcat关闭导致执行器服务丢失数据吗?

时间:2019-02-01 22:14:38

标签: java tomcat executorservice shutdown

我有几个卡夫卡消费者从卡夫卡簇拾取消息,然后他们把这些消息中的执行器的服务进行处理。消息本身的处理非常耗时。当我尝试关闭应用程序(即关闭Tomcat)时,我注意到的是,执行程序服务将继续运行,但速度要慢得多,并且会有一些套接字超时异常。这意味着我可以等待很长一段时间Tomcat关闭进程完成,但它只是保持运行。如果我手动杀Tomcat的线程,那么我会失去很多信息。我有办法解决此问题吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

线程池仍然存在

执行程序的线程池可能在其父应用程序结束后继续运行。因此,在退出应用程序时,应始终正常关闭执行程序。

ServletContextListener

对于基于Java Servlet技术的Web应用程序,Servlet spec定义了Web应用程序启动和退出的挂钩。

该钩子是ServletContextListener界面。该接口需要一对方法,一个方法要在处理向Web应用程序的第一个传入请求之前由Servlet容器调用,而另一个方法要在最后一个响应发出后再调用。规范要求每个Servlet容器(例如Tomcat)在适当的时候调用这些方法。

在这两种方法中,您都可以实例化执行程序服务,然后将其关闭。

您可以通过编写类来实现接口。您还必须将该类标记到容器。标记它的最简单方法是使用@WebListener批注。

Stack Overflow已对此问题进行了多次讨论。 search for more info和示例。

JSR 236:Java TM EE的并发实用工具

如果使用成熟的Jakarta EE(以前称为Java EE)实现(Glassfish,Payara,JBoss等),而不是仅使用Servlet容器(Tomcat,Jetty等),则这项工作会容易得多)。这样的服务器将提供JSR 236的实现,以自动处理执行程序的生命周期。因此,您无需实施ServletContextListener

这个问题在堆栈溢出中也已经解决了很多次。因此,搜索更多信息。