【发布时间】:2010-12-05 17:10:20
【问题描述】:
我需要保存一些数据,最好是在 java web 应用程序停止时或 tomcat 停止时。如何才能做到这一点? 编辑: 如果我使用 jvm 关闭钩子有什么缺点吗?
【问题讨论】:
标签: java web-applications shutdown
我需要保存一些数据,最好是在 java web 应用程序停止时或 tomcat 停止时。如何才能做到这一点? 编辑: 如果我使用 jvm 关闭钩子有什么缺点吗?
【问题讨论】:
标签: java web-applications shutdown
在您的 web.xml 中使用实现 ServletContextListener 的类:
<web-app>
<!-- Usual stuff here -->
<listener>
<listener-class>com.mycompany.MyClass</listener-class>
</listener>
</web-app>
【讨论】:
@WebListener 注释现在为您提供了这种行为,而无需编辑web.xml。看到这个有启发性的answer by BalusC。
为什么要在关机期间专门这样做?您真的需要保存它(如“它绝对重要吗?”)还是喜欢(如“会很好,但我会活下去)没有它”)?
区别很重要 - 无论您尝试哪种方法(其他答案或 JVM shutdown hook 建议的 servlet/上下文侦听器),不保证它会被实际调用。
Servlet/上下文侦听器销毁事件只会在正常(正常)容器关闭或应用程序重新加载期间触发。在进程中断期间也会触发 JVM 关闭钩子;但是杀死一个进程(或切断电源)显然不会触发。
【讨论】:
作为对 leonm 回答的补充:
如果你使用Spring,你可以使用Spring的“生命周期管理”来达到类似的效果。例如,您可以使用 @PreDestroy 注释 bean 中的方法,以便在容器关闭时自动调用它。这样,您就无需在web.xml 中添加任何内容。
【讨论】:
我建议使用 ehcache 来缓存这些信息。如果你使用ehcache的持久化存储,那么当你再次启动Tomcat时,缓存的数据仍然可用。
实际上,这会将问题委托给 ehcache,它针对这些类型的问题进行了优化。
【讨论】: