java web应用程序的closures钩子
当java web应用程序停止时,或者当tomcat停止时,我需要优先保存一些数据。 如何才能做到这一点? 编辑:如果我使用jvm关机挂钩的任何缺点?
在web.xml中使用实现ServletContextListener的类:
<web-app> <!-- Usual stuff here --> <listener> <listener-class>com.mycompany.MyClass</listener-class> </listener> </web-app>
为什么你要在关机时专门做? 你真的需要保存它吗(比如“绝对是关键吗?”)还是你想 (如“会好的,但我会活下去”)?
这个区别很重要 – 无论您尝试什么方法(servlet / context listener,如其他答案或JVM shutdown hook所build议的那样),都不能保证它会被真正调用。
Servlet /上下文侦听器销毁事件只会在正常(正常)容器closures或应用程序重新加载期间触发。 在进程中断期间也会触发JVMclosures钩子; 然而,杀死一个进程(或切断电源)显然不会触发。
除了leonm的回答:
如果你使用Spring,你可以使用Spring的“生命周期pipe理”来达到类似的效果。 例如,您可以使用@PreDestroy
在bean中注释一个方法,以便在容器closures时自动调用它。 这样,你不需要把任何东西放到web.xml
。
参见Spring beans工厂生命周期 。
我build议使用ehcache来caching这些信息。 如果您使用ehcache的持久性存储,那么当您再次启动Tomcat时,caching的数据仍将可用。
实际上,这将问题委托给针对这些types的问题进行优化的ehcache。