4

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

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

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

$CATALINA_HOME/bin/shutdown.sh

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

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

我正在使用 tomcat 6.0.35。

4

2 回答 2

5

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

好吧,我认为您需要考虑如何使其发挥作用

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

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

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

于 2012-07-11T23:50:30.427 回答
1

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

为什么不运行这个进程外而不用担心 webapp、上下文事件、关闭钩子或任何腐烂?

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

于 2012-07-12T00:32:57.273 回答