用于java Web应用程序的shutdown hook

use*_*196 38 java web-applications shutdown

当java Web应用程序停止或者tomcat停止时,我需要优先保存一些数据.如何才能做到这一点?编辑:如果我使用jvm关闭钩子的任何缺点?

leo*_*onm 52

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

<web-app>
    <!-- Usual stuff here -->
    <listener>
        <listener-class>com.mycompany.MyClass</listener-class>
    </listener>
</web-app>
Run Code Online (Sandbox Code Playgroud)

  • **现在更容易......**[`@ WebListener`](http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebListener.html)注释添加到[Servlet 3.0规范] (https://jcp.org/en/jsr/detail?id=315)现在为您提供此行为,而无需编辑web.xml.见这个有启发性的[BalusC回答](http://stackoverflow.com/a/9186070/642706). (16认同)

Chs*_*y76 15

为什么要在关机期间专门做?而你真的需要将其保存(如"是绝对关键的?"),或者你会喜欢到(如"将是不错,但我会没有它")?

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

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

  • 不要使用JVM钩子 - 这对Tomcat本身或桌面应用程序更有用.你肯定更喜欢通过JVM钩子的ServletContextListener. (5认同)

sle*_*ske 11

作为leonm答案的补充:

如果使用Spring,可以使用Spring的"生命周期管理"来实现类似的效果.例如,您可以在bean中注释方法,@PreDestroy以便在容器关闭时自动调用它.这样,你就不需要把任何东西放入了web.xml.

请参阅Spring beans工厂生命周期.