【问题标题】:shutdown hook for java web applicationjava web应用程序的关闭钩子
【发布时间】:2010-12-05 17:10:20
【问题描述】:

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

【问题讨论】:

    标签: java web-applications shutdown


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    为什么要在关机期间专门这样做?您真的需要保存它(如“它绝对重要吗?”)还是喜欢(如“会很好,但我会活下去)没有它”)?

    区别很重要 - 无论您尝试哪种方法(其他答案或 JVM shutdown hook 建议的 servlet/上下文侦听器),不保证它会被实际调用。

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

    【讨论】:

    • 它属于“会很好,但没有它我会活下去”类别。我需要在应用程序关闭时保存我的应用程序尝试连接到文件(而不是数据库)的一堆服务器状态,然后在应用程序再次启动时重新加载这些信息。如果我的应用程序尝试连接到服务器并且它已关闭,那么它会将其标记为已关闭,以便它不必再次重试。由于查询经常发生,我只在内存中标记这些状态,而不是在文件中。因此,当应用程序关闭时,最好记住哪些服务器已关闭。
    • 我倾向于 ServletContextListener 或 JVM hook
    • 不要使用 JVM 钩子——这更适用于 Tomcat 本身或桌面应用程序。您绝对应该更喜欢 ServletContextListener 而不是 JVM 挂钩。
    • @unknown - 根据您的评论,我会选择 ServletContextListener。虽然我不一定同意 JVM 挂钩是“用于 Tomcat 本身的”,但在您的情况下,如果您的上下文停止(即使 Tomcat 没有停止),您希望保存数据,因此侦听器更合适。跨度>
    【解决方案3】:

    作为对 leonm 回答的补充:

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

    Spring beans factory lifecycle

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        相关资源
        最近更新 更多