【问题标题】:shutdown hook in tomcat (necessary) not runningTomcat中的关闭挂钩(必要)未运行
【发布时间】:2012-07-11 16:33:06
【问题描述】:

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

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

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

$CATALINA_HOME/bin/shutdown.sh

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

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

我使用的是 tomcat 6.0.35。

【问题讨论】:

    标签: java tomcat shutdown


    【解决方案1】:

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

    我认为您需要考虑如何让它发挥作用

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

    • 当您的 web 应用程序被 web 容器关闭时,关闭挂钩将不会运行。这意味着如果您重新启动或重新部署您的 web 应用程序,您将遇到孤立数据库线程的问题。

    • 如果您的关闭挂钩最终运行,它可能会失败,因为您的 web 应用程序的其余部分已经被 web 容器关闭。例如,webapp 的 JDBC 连接池通常会被 nuked。请注意,作为 Tomcat 在重新部署时避免 PermGen 存储泄漏的策略的一部分,许多“核爆”发生在幕后...

    【讨论】:

    • 此外,如果您在不重新启动的情况下重新部署,这个低优先级的 webapp-launched 线程(超过上下文)将很快导致 PermGen 泄漏。只是一个坏主意。
    【解决方案2】:

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

    为什么不在进程外运行这个程序,而不必为 web 应用程序、上下文事件、关闭挂钩或任何其他问题而烦恼?

    关闭钩子是一个杂物,正如@StephenC 所说,它们不会在您想要它们时触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多