我有一个长时间运行的 CPU 和数据库密集型线程(以低优先级运行),可以根据管理员请求由我的 tomcat 应用程序触发。
我为这个线程使用了一个关闭 Hook ,这样如果应用程序被强行停止,它可以在退出前清理数据库状态。在独立模式下完美工作,使用 control-C 并在 eclipse 控制台中取消。
但是在 tomcat 下运行时,当我执行以下操作时:
$CATALINA_HOME/bin/shutdown.sh
我通过调试日志记录验证了我的 servlet contextDestroyed 消息是由 tomcat 发送的,但是对于这个线程,消息无法阻止它,重要的一点是我的关闭钩子(Hook)永远不会触发。
我注意到其他人说使用 contextDestroyed 消息,但这对我不起作用,而且一些问题和答案暗示关闭 Hook 在 tomcat 中适用于他们。
我使用的是 tomcat 6.0.35。
最佳答案
I noticed other people saying use contextDestroyed message, but that won't work for me
嗯,我认为您需要考虑如何让它发挥作用。
设置关闭 Hook 的 webapp 不是正确的解决方案。
当您的 Web 应用程序被 Web 容器关闭时,关闭钩子(Hook)将不会运行。这意味着如果您重新启动或重新部署您的 web 应用程序,您将遇到孤立的数据库线程问题。
如果您的关闭 Hook 最终运行,它很可能会失败,因为您的 web 应用程序的其余部分已经被 web 容器关闭。例如,webapp 的 JDBC 连接池通常会被破坏。请注意,作为 Tomcat 在重新部署时避免 PermGen 存储泄漏的策略的一部分,许多“核攻击”都在幕后发生......
关于java - tomcat 中的关闭 Hook (必需)未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11443133/