contextDestroyed()vs addShutdownHook()

Pau*_*ora 5 java application-shutdown servlet-listeners

我目前正在实现ServletContextListener并使用contextDestroyed()它在关闭之前在我的Web应用程序上运行清理任务.但是,我一直在阅读如何Runtime.addShutdownHook(Thread)用于同一目的.

在取消部署之前,这两种运行清理方法有什么区别吗?在功能,效率和可维护性方面,哪种Web应用程序更受欢迎?

duf*_*ymo 8

我认为ServletContextListener更适合Web应用程序,因为您为每个会话清理资源.

关闭JVM时执行关闭挂钩.那就是当你停止你的容器时,这是一次性事件.


pru*_*nge 5

使用 addShutdownHook() 的危险在于,您可能会遇到类加载器泄漏,这在您多次重新部署应用程序时会变得很明显。

因为关闭钩子的类(Web 应用程序中的 Thread 子类或 Runnable 实现)来自 Web 应用程序的类加载器,即使在容器取消部署 Web 应用程序之后,关闭钩子仍将注册到系统。这意味着整个 webapp 的类加载器不能被垃圾收集。

我肯定会推荐 ServletContextListener。