Java Tomcat8在关机时杀死我的线程

Java Tomcat8在关机时杀死我的线程,java,tomcat8,Java,Tomcat8,我创建了一个Web应用程序,需要在关机时进行一些清理。清理过程大约需要一分钟,完全可以完成 当我将我的webapp部署到tomcat8上并停止它时,我的ContextListener将被调用,清理工作开始。但Tomcat似乎很难阻止我的线程,它将不再完整。至少在Tomcat6上,这不是问题 一个如何配置Tomcat8以防止行为不端的想法 部分答案: 我发现这与我做的性能优化有关。我使用startStopThreads=“2”并行启动我的应用程序,效果很好,但在关机时,这似乎也会杀死我的线程 如果

我创建了一个Web应用程序,需要在关机时进行一些清理。清理过程大约需要一分钟,完全可以完成

当我将我的webapp部署到tomcat8上并停止它时,我的ContextListener将被调用,清理工作开始。但Tomcat似乎很难阻止我的线程,它将不再完整。至少在Tomcat6上,这不是问题

一个如何配置Tomcat8以防止行为不端的想法

部分答案:


我发现这与我做的性能优化有关。我使用
startStopThreads=“2”
并行启动我的应用程序,效果很好,但在关机时,这似乎也会杀死我的线程

如果您有一项任务要在关机时执行,我会将其添加为关机挂钩。Tomcat8很可能被称为System.exit(),这是一个正常的操作,它会杀死所有用户线程,但不会启动关闭挂钩

更好的解决方案是永远不要让系统处于您真正需要的状态。i、 e.你不能假设一个应用程序会优雅地消亡



如果您正在等待客户端断开连接,我建议您添加一个关闭阶段。在此阶段,您拒绝新的连接,将连接移动到另一台服务器,或者尝试优雅地告诉现有的连接您将离开。在短时间或超时后,您将关闭。

如果您有一项任务要在关闭时执行,我会将其添加为关闭挂钩。Tomcat8很可能被称为System.exit(),这是一个正常的操作,它会杀死所有用户线程,但不会启动关闭挂钩

更好的解决方案是永远不要让系统处于您真正需要的状态。i、 e.你不能假设一个应用程序会优雅地消亡



如果您正在等待客户端断开连接,我建议您添加一个关闭阶段。在此阶段,您拒绝新的连接,将连接移动到另一台服务器,或者尝试优雅地告诉现有的连接您将离开。在短时间或超时后,您将关闭。

如果您有一项任务要在关闭时执行,我会将其添加为关闭挂钩。Tomcat8很可能被称为System.exit(),这是一个正常的操作,它会杀死所有用户线程,但不会启动关闭挂钩

更好的解决方案是永远不要让系统处于您真正需要的状态。i、 e.你不能假设一个应用程序会优雅地消亡



如果您正在等待客户端断开连接,我建议您添加一个关闭阶段。在此阶段,您拒绝新的连接,将连接移动到另一台服务器,或者尝试优雅地告诉现有的连接您将离开。在短时间或超时后,您将关闭。

如果您有一项任务要在关闭时执行,我会将其添加为关闭挂钩。Tomcat8很可能被称为System.exit(),这是一个正常的操作,它会杀死所有用户线程,但不会启动关闭挂钩

更好的解决方案是永远不要让系统处于您真正需要的状态。i、 e.你不能假设一个应用程序会优雅地消亡



如果您正在等待客户端断开连接,我建议您添加一个关闭阶段。在此阶段,您拒绝新的连接,将连接移动到另一台服务器,或者尝试优雅地告诉现有的连接您将离开。在短时间或超时后,您将关闭。

我已经这样做了!我实现了ServletContextListener并在contextDestroyed()函数中进行清理。但不知何故,这个功能永远不会结束!我甚至捕获了ThreadDeatch,但它似乎没有被抛出,因此stop()方法似乎没有运行。Tomcat8在出口处转储所有StackTrace,看起来好像它检测到了不喜欢的东西,但我没有看到任何关于它的文档!顺便说一句,我并不真正做清理工作。我等待一些客户端断开连接并保存其当前更改。这在以前奏效了。。。可悲的是,现在不是anmore了。@Daniel您不能等待客户断开连接。Tomcat将在其末端断开它们的连接,并且您不应该在关闭挂钩中做任何耗时的事情。修改你的要求。@Daniel我已经更新了我的答案。我怀疑之前的行为是不安全和不可支持的,这就是为什么他们删除了它。也许你是对的。。。在向Tomcat8发送停止信号之前,我可能会进入关机阶段。至少是更可靠的关机方式。我已经这么做了!我实现了ServletContextListener并在contextDestroyed()函数中进行清理。但不知何故,这个功能永远不会结束!我甚至捕获了ThreadDeatch,但它似乎没有被抛出,因此stop()方法似乎没有运行。Tomcat8在出口处转储所有StackTrace,看起来好像它检测到了不喜欢的东西,但我没有看到任何关于它的文档!顺便说一句,我并不真正做清理工作。我等待一些客户端断开连接并保存其当前更改。这在以前奏效了。。。可悲的是,现在不是anmore了。@Daniel您不能等待客户断开连接。Tomcat将在其末端断开它们的连接,并且您不应该在关闭挂钩中做任何耗时的事情。修改你的要求。@Daniel我已经更新了我的答案。我怀疑之前的行为是不安全和不可支持的,这就是为什么他们删除了它。也许你是对的。。。在向Tomcat8发送停止信号之前,我可能会进入关机阶段。至少是更可靠的关机方式。我已经这么做了!我实现了ServletContextListener并在contextDestroyed()函数中进行清理。但不知何故,这个功能永远不会结束!我甚至捕获了ThreadDeatch,但它似乎没有被抛出,因此stop()方法似乎没有运行。Tomcat8在出口处转储所有StackTrace,看起来好像它检测到了它不喜欢的东西,但我没有看到任何文档