java web应用程序的关闭钩子

java web应用程序的关闭钩子,java,web-applications,shutdown,Java,Web Applications,Shutdown,我需要在java web应用程序停止或tomcat停止时保存一些数据。如何做到这一点? 编辑: 如果我使用jvm关闭挂钩有什么缺点吗?请使用在web.xml中实现的类: <web-app> <!-- Usual stuff here --> <listener> <listener-class>com.mycompany.MyClass</listener-class> </listener

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

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

<web-app>
    <!-- Usual stuff here -->
    <listener>
        <listener-class>com.mycompany.MyClass</listener-class>
    </listener>
</web-app>

com.mycompany.MyClass

为什么要在关机时特别执行此操作?你真的需要保存它(比如“它绝对重要吗?”),还是愿意保存它(比如“如果没有它,我会活得很好”)

区别很重要-无论您尝试什么方法(其他答案建议的servlet/context listener或),都不能保证实际调用它


Servlet/上下文侦听器销毁事件仅在正常(正常)容器关闭或应用程序重新加载期间触发。JVM关机钩子也会在进程中断期间触发;但是,终止进程(或切断电源)显然两者都不会触发。

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


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

作为leonm答案的补充:

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


请看。

它属于“如果没有它我会活得更好”类别。我需要保存一堆服务器的状态,当应用程序关闭时,我的应用程序正试图连接到一个文件(而不是数据库),然后在应用程序再次启动时重新加载这些信息。如果我的应用程序尝试连接到服务器,但服务器已关闭,则会将其标记为已关闭,这样就不必再次重试。由于查询经常发生,我只在内存中标记这些状态,而不是在文件中。因此,当应用程序关闭时,最好记住哪些服务器关闭了。我倾向于使用ServletContextListener或JVM钩子。不要使用JVM钩子——这更适合Tomcat本身或桌面应用程序。您应该更喜欢ServletContextListener而不是JVM钩子。@未知-根据您的评论,我选择ServletContextListener。虽然我不一定同意JVM钩子是“针对Tomcat本身的”,但在您的情况下,如果您的上下文被停止(即使Tomcat没有停止),您会希望保存您的数据,因此侦听器更合适。现在更容易了……添加到现在的注释使您无需编辑web.xml即可实现此行为。看到这一点很有启发性。