tomcat中的shutdown hook(必要)没有运行

我有一个长期运行的cpu和数据库密集型线程(以低优先级运行),可由管理员请求由我的tomcat应用程序触发。

我为此线程使用了一个关闭钩子,因此如果应用程序被强制停止,它可以在退出之前清理数据库状态。 在独立模式下完美运行,使用control-C并在eclipse控制台中取消。

但是当在tomcat下运行时,当我做一个:

$ CATALINA_HOME / bin中/ shutdown.sh

我通过调试日志validation我的servlet contextDestroyed消息是由tomcat发送的,但是对于这个线程,消息无法阻止它,重要的是我的shutdown hook永远不会触发。

我注意到其他人说使用contextDestroyed消息,但这对我不起作用,并且一些问题和答案暗示关闭钩子在tomcat中为它们工作。

我正在使用tomcat 6.0.35。

我有一个长期运行的cpu和数据库密集型线程(以低优先级运行),可由管理员请求由我的tomcat应用程序触发。

为什么不运行这个进程外的而不是麻烦的webapp,上下文事件,关闭钩子,或任何腐烂?

关机钩是一种kludge,正如@StephenC所说,它们不会在你想要的时候开火。

我注意到其他人说使用contextDestroyed消息,但这对我不起作用

好吧,我认为你需要考虑如何让它发挥作用

设置关闭挂钩的webapp不是正确的解决方案。

  • Web应用程序关闭Web应用程序时,关闭挂钩将不会运行。 这意味着如果重新启动或重新部署Web应用程序,则需要处理孤立的数据库线程问题。

  • 如果您的关闭挂钩最终运行,则可能会失败,因为Web容器的其余部分已被Web容器关闭。 例如,webapp的JDBC连接池通常已被破解。 请注意,许多“nuking”发生在幕后,作为Tomcat避免重新部署时PermGen存储泄漏的策略的一部分……