当java Web应用程序停止或tomcat停止时,我需要优先保存一些数据。如何才能做到这一点? 编辑: 如果我使用jvm shutdown hook会有什么缺点吗?
答案 0 :(得分:52)
在web.xml中使用实现ServletContextListener的类:
<web-app>
<!-- Usual stuff here -->
<listener>
<listener-class>com.mycompany.MyClass</listener-class>
</listener>
</web-app>
答案 1 :(得分:15)
为什么要在关机期间专门执行此操作?你真的需要来保存它(如“它绝对是关键的吗?”)或者你喜欢(就像“会很好但我会活着”没有它“)?
区别很重要 - 无论你尝试什么方法(其他答案或JVM shutdown hook建议的servlet /上下文监听器),无保证都会实际调用它。< / p>
Servlet /上下文侦听器销毁事件只会在正常(正常)容器关闭期间或应用程序重新加载期间触发。在进程中断期间也会触发JVM关闭挂钩;然而,杀死一个过程(或切断电源)显然不会触发。
答案 2 :(得分:11)
作为leonm答案的补充:
如果使用Spring,可以使用Spring的“生命周期管理”来实现类似的效果。例如,您可以使用@PreDestroy
在bean中注释方法,以便在容器关闭时自动调用它。这样,您就不需要在web.xml
中添加任何内容。
答案 3 :(得分:3)
我建议使用ehcache来缓存此信息。如果您使用ehcache的持久存储,那么当您再次启动Tomcat时,缓存的数据仍然可用。
实际上,这会将问题委托给ehcache,后者针对这些类型的问题进行了优化。