Tomcat 关闭时如何进行最终的数据库推送?
How to do a final DB push when a Tomcat shutdown occurs?
我有这个 Web 应用程序,它可以缓冲内容,然后将所述内容批量插入到数据库中。
现在我希望能够在 Tomcat 关闭事件发生时进行最后的批量插入,这样我就不会丢失我的东西。
我的应用程序是一个非常简单的 Guice+Jersey API。
我已经尝试覆盖 GuiceServletContextListener
的 contextDestroy
但它最终出现在 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。
设置
- 编写清理程序 class,包含所有需要的依赖项。
- 将此清理 class 绑定到 guice。
- 当您创建
Injector
时,在您的 GuiceServletContextListener
中保留 returns 清理 class 的提供程序实例(不要保留Injector
。它包含整个依赖树。
- 当
contextDestroyed
方法被调用时,使用provider获取清理实例class和运行逻辑。
我有这个 Web 应用程序,它可以缓冲内容,然后将所述内容批量插入到数据库中。 现在我希望能够在 Tomcat 关闭事件发生时进行最后的批量插入,这样我就不会丢失我的东西。
我的应用程序是一个非常简单的 Guice+Jersey API。
我已经尝试覆盖 GuiceServletContextListener
的 contextDestroy
但它最终出现在 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。
设置
- 编写清理程序 class,包含所有需要的依赖项。
- 将此清理 class 绑定到 guice。
- 当您创建
Injector
时,在您的GuiceServletContextListener
中保留 returns 清理 class 的提供程序实例(不要保留Injector
。它包含整个依赖树。 - 当
contextDestroyed
方法被调用时,使用provider获取清理实例class和运行逻辑。