【问题标题】:Order of calling destroy() method on servlets/filters在 servlet/过滤器上调用 destroy() 方法的顺序
【发布时间】:2011-10-16 00:20:19
【问题描述】:

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

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

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

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

其实我需要做的只是最后关闭log4j。不过提前想知道调用destroy()方法有没有一些规则。

【问题讨论】:

  • 不是答案:如果您要关闭 Servlet 之间共享的资源,我会使用 ServletContext 侦听器,该侦听器仅调用一次。所以你不依赖于任何“奇怪”的隐式关闭序列。
  • 为什么 log4j 必须关闭?
  • @Kevin Panko:问得好,也许他/她使用一些记录器记录到数据库或队列等?
  • 如果您不关闭 log4j,它将在应用容器运行之前不会释放日志文件。

标签: java jakarta-ee servlets log4j web.xml


【解决方案1】:

我查看了 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。保证只初始化和销毁​​一次。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2023-04-03
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多