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

时间:2012-07-11 23:38:09

标签: java tomcat shutdown

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

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

但是当我在tomcat下运行时,以及当我执行时:

$ CATALINA_HOME /斌/ shutdown.sh

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

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

我正在使用tomcat 6.0.35。

2 个答案:

答案 0 :(得分:5)

  

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

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

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

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

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

答案 1 :(得分:1)

  

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

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

关闭钩子是一种kludge,正如@StephenC所说,当你想要它们时它们不会发射。