Tomcat 关闭时如何进行最终的数据库推送?

How to do a final DB push when a Tomcat shutdown occurs?

我有这个 Web 应用程序,它可以缓冲内容,然后将所述内容批量插入到数据库中。 现在我希望能够在 Tomcat 关闭事件发生时进行最后的批量插入,这样我就不会丢失我的东西。

我的应用程序是一个非常简单的 Guice+Jersey API。

我已经尝试覆盖 GuiceServletContextListenercontextDestroy 但它最终出现在 NPE 中,因为我注入的依赖项似乎在那个时候已经被 GC。

我想这是一个 JVM 关闭,您可以向 JVM 注册一个关闭挂钩,让您在它关闭时执行您的代码,就像这样-

Thread shutdownHook = new Thread()
    {
        @Override
        public void run()
        { 
            //Do your work here
        }
    };
Runtime.getRuntime().addShutdownHook(shutdownHook);

只有当对某个实例的硬引用为零时,GC 才能收集资源。我认为 GuiceServletContextListener 仍然是您最好的选择。此时 Tomcat 正在尝试清理资源,然后再尝试让 GC 回收您的应用 运行 正在进入的 ClassLoader。只要您有足够的资源,您需要的一切都应该仍然可用参考。

当您创建 Injector 时,请保留对 Provider 的引用,returns 对 class 进行清理。调用 contextDestroyed 时,从提供程序和 运行 逻辑中获取清理实例 class。

设置

  1. 编写清理程序 class,包含所有需要的依赖项。
  2. 将此清理 class 绑定到 guice。
  3. 当您创建 Injector 时,在您的 GuiceServletContextListener 中保留 returns 清理 class 的提供程序实例(不要保留Injector。它包含整个依赖树。
  4. contextDestroyed方法被调用时,使用provider获取清理实例class和运行逻辑。