40

我最好在 java web 应用程序停止或 tomcat 停止时保存一些数据。如何才能做到这一点?编辑:如果我使用 jvm 关闭钩子有什么缺点吗?

4

4 回答 4

55

在 web.xml 中使用实现ServletContextListener的类:

<web-app>
    <!-- Usual stuff here -->
    <listener>
        <listener-class>com.mycompany.MyClass</listener-class>
    </listener>
</web-app>
于 2009-10-11T05:33:19.190 回答
16

为什么要在关机期间专门这样做?你真的需要保存它(如“它绝对关键吗?”)还是你愿意(如“会很好,但没有它我会活下去”)?

区别很重要 - 无论您尝试哪种方法(其他答案或JVM 关闭挂钩建议的 servlet/上下文侦听器),都不能保证它会被实际调用。

Servlet/上下文侦听器销毁事件只会在正常(正常)容器关闭或应用程序重新加载期间触发。在进程中断期间也会触发 JVM 关闭钩子;但是杀死一个进程(或切断电源)显然不会触发。

于 2009-10-11T05:42:53.397 回答
11

作为 leonm 答案的补充:

如果使用 Spring,可以使用 Spring 的“生命周期管理”来达到类似的效果。例如,您可以注释 bean 中的方法,@PreDestroy使其在容器关闭时自动调用。这样,您无需将任何内容放入web.xml.

请参阅Spring beans 工厂生命周期

于 2011-08-24T10:27:05.017 回答
3

我建议使用 ehcache 来缓存这些信息。如果你使用ehcache的持久化存储,那么当你再次启动Tomcat时,缓存的数据仍然可用。

实际上,这会将问题委托给 ehcache,它针对这些类型的问题进行了优化。

于 2009-10-11T10:30:08.627 回答