在 servlet/filter 上调用 destroy() 方法的顺序

发布于 2024-11-26 21:22:32 字数 300 浏览 2 评论 0原文

我有一个 Java 网络应用程序。

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

<load-on-startup>1</load-on-startup>

但是,如何指定调用 destroy( ) 方法?

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

I have a Java web app.

I can specify the order of calling init() method on servlets by the parameter in web.xml:

<load-on-startup>1</load-on-startup>

But, how can I specify the order of calling destroy() methods?

Actually, what I need to do is just shutdown log4j in the end. But in advance I want to know if there is some rules for calling destroy() method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最偏执的依靠 2024-12-03 21:22:32

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

2.3.4 服务结束

servlet 容器对于任何特定的情况不需要保持 servlet 加载
一段时间。 servlet 实例可以在 servlet 容器中保持活动状态
servlet 容器(可能是一个
天数、月数或年数),或两者之间的任何时间量。

当 servlet 容器确定应从其中删除 servlet 时
service,它调用Servlet接口的destroy方法,让servlet
释放它正在使用的任何资源并保存任何持久状态。例如,
当容器想要节省内存资源时,或者当它需要时,它可能会这样做
被关闭

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

建议:

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

I had a look into the Servlet 3.0 spec. It does not define any rules on the order in which the destroy methods have to be called. Thus, it is not specified and you should not rely on any vendor specific behaviour. A second reason for not releasing resources shared across Servlets is, that a given Servlet can be destroyed at any time - if the container chooses to do so. See section 2.3.4 of Servlet 3.0 specification:

2.3.4 End of Service

The servlet container is not required to keep a servlet loaded for any particular
period of time. A servlet instance may be kept active in a servlet container for a
period of milliseconds, for the lifetime of the servlet container (which could be a
number of days, months, or years), or any amount of time in between.

When the servlet container determines that a servlet should be removed from
service, it calls the destroy method of the Servlet interface to allow the servlet to
release any resources it is using and save any persistent state. For example, the
container may do this when it wants to conserve memory resources, or when it is
being shut down

Let's say you have 3 Servlets - A, B, and C. If A and B rely on resources managed by C, it may happen that the container decides to temporarily disable C by calling its destroy method. So A and B won't have access to those resources any more. I must admit, I've never seen this behaviour in reality.

Recommendation:

Use a ServletContextListener. It is guaranteed to be initialized and destroyed only once.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文