Java tomcat中的关机挂钩(必要)未运行
我有一个长时间运行的cpu和数据库密集型线程(以低优先级运行),可以通过管理员请求由tomcat应用程序启动 我为这个线程使用了一个shutdownhook,这样,如果应用程序被强制停止,它可以在退出之前清理数据库状态。使用eclipse控制台中的control-C和Cancel,完全可以在独立模式下工作 但在tomcat下运行时,以及在我执行以下操作时: $CATALINA_HOME/bin/shutdown.sh 我通过调试日志验证了我的servlet contextDestroyed消息是由tomcat发送的,但是对于这个线程,消息无法阻止它,重要的一点是我的关闭钩子永远不会触发 我注意到其他人说使用contextDestroyed消息,但这对我来说不起作用,而且一些问题和答案暗示关闭钩子在tomcat中对他们起作用 我正在使用tomcat 6.0.35 我注意到其他人说使用contextDestroyed消息,但这对我不起作用 嗯,我想你需要想一想怎样才能使它工作起来 webapp设置关机挂钩不是正确的解决方案Java tomcat中的关机挂钩(必要)未运行,java,tomcat,shutdown,Java,Tomcat,Shutdown,我有一个长时间运行的cpu和数据库密集型线程(以低优先级运行),可以通过管理员请求由tomcat应用程序启动 我为这个线程使用了一个shutdownhook,这样,如果应用程序被强制停止,它可以在退出之前清理数据库状态。使用eclipse控制台中的control-C和Cancel,完全可以在独立模式下工作 但在tomcat下运行时,以及在我执行以下操作时: $CATALINA_HOME/bin/shutdown.sh 我通过调试日志验证了我的servlet contextDestroyed消息是
- 当web容器关闭您的web应用程序时,关闭挂钩将不会运行。这意味着,如果重新启动或重新部署webapp,则需要处理孤立的DB线程
- 如果关闭钩子最终运行,它很可能会失败,因为web容器已经关闭了web应用程序的其余部分。例如,webapp的JDBC连接池通常会被屏蔽。请注意,很多“核攻击”都发生在幕后,这是Tomcat避免重新部署PermGen存储泄漏的策略的一部分
关机钩子是一个难题,正如@StephenC所说,它们不会在你想要的时候启动。此外,如果你在不重新启动的情况下重新部署,这个低优先级的webapp启动线程(在上下文之外)将相当快地导致PermGen泄漏。只是一个坏主意。