在servlets/filters上调用destroy()方法的顺序

bug*_*gs_ 6 java web.xml servlets log4j java-ee

我有一个Java Web应用程序.

我可以init()通过以下参数指定servlet 上调用方法的顺序web.xml:

<load-on-startup>1</load-on-startup>
Run Code Online (Sandbox Code Playgroud)

但是,我如何指定调用destroy()方法的顺序?

实际上,我需要做的就是最后关闭log4j.但事先我想知道调用destroy()方法是否有一些规则.

hom*_*ome 8

我看了一下Servlet 3.0规范.它没有定义destroy必须调用方法的顺序的任何规则.因此,它未指定,您不应该依赖任何供应商特定的行为.不释放Servlet共享资源的第二个原因是,任何时候都可以销毁给定的Servlet - 如果容器选择这样做的话.请参阅Servlet 3.0规范的2.3.4节:

2.3.4服务终止

servlet容器不需要在任何特定时间段内加载servlet.对于servlet容器的生命周期(可能是几天,几个月或几年),或者介于两者之间的任何时间量,servlet实例可以在servlet容器中保持活动状态一段时间.

当servlet容器确定应该从服务中删除servlet时,它调用 Servlet接口的destroy方法以允许servlet释放它正在使用的任何资源并保存任何持久状态.例如,容器可以在想要节省内存资源时或在关闭时执行此操作

假设您有3个Servlet - A,B和C.如果A和B依赖于C管理的资源,则容器可能会通过调用其destroy方法来决定暂时禁用C.因此A和B将无法再访问这些资源.我必须承认,我从未在现实中看到过这种行为.

建议:

使用ServletContextListener.它保证只被初始化和销毁​​一次.