Java 当服务器正在终止时调用sessionDestroyed()

Java 当服务器正在终止时调用sessionDestroyed(),java,tomcat,servlets,servlet-listeners,Java,Tomcat,Servlets,Servlet Listeners,为什么只在失效或超时时调用sessionDestroyed(),而在服务器终止时不调用?当服务器终止时,如何在每个会话上进行一些操作?关于您的第一个问题: 为什么sessionDestroyed()只在无效或超时时调用,而在服务器终止时不调用 以下是Tomcat上的一篇文章,解释了为什么在Tomcat(至少从Tomcat 6.0.33开始)中关闭时没有调用sessionDestroyed(): 当我请求我的web应用程序时,我收到sessionCreated,当我 根据我收到的sessionDe

为什么只在失效或超时时调用
sessionDestroyed()
,而在服务器终止时不调用?当服务器终止时,如何在每个会话上进行一些操作?

关于您的第一个问题:

为什么sessionDestroyed()只在无效或超时时调用,而在服务器终止时不调用

以下是Tomcat上的一篇文章,解释了为什么在Tomcat(至少从Tomcat 6.0.33开始)中关闭时没有调用
sessionDestroyed()

当我请求我的web应用程序时,我收到sessionCreated,当我 根据我收到的sessionDestroyed代码使会话无效。 不幸的是,当我停止web应用程序时,我没有收到 会期结束

我检查了停止StandardContext的代码。我看得出来 调用StandardManager.stop,这是正常的 但是当调用StandardManager.doUnload()时,在其实现中* 调用session.expire(false)*,其中“false”实际上是 指示是否通知侦听器。因为它是用 “false”-不调用侦听器

这不是我的帖子,我把这篇帖子的作者维奥莉塔归功于她

本文提供了一种修补
StandardManager.java
的方法

如果您不想修改该类(我个人尽量避免修改属于应用服务器的类),那么您可以采取其他方法

关于第二个问题:

当服务器终止时,如何在每个会话上进行一些操作

服务器终止时,为什么要对每个会话执行操作?Servlet规范提供了在服务器关闭时执行代码的方法。但是,它们不提供一种方法,您可以通过该方法在每个活动会话上执行操作(可能是通过设计)

正如前面的回答所提到的,会话管理应该由Servlet容器来处理,您可以重新考虑当前的应用程序方法

对于关闭服务器时的常规处理清理,您有
ServletContextListener.contextdestromed
Servlet.destroy

ServletContextListener
接口提供了一种
ContextDistromed
生命周期方法


Servlet接口提供销毁方法,用于在服务器关闭时释放任何资源或处理任何清理

Java Servlet 3.0规范规定,服务器/应用程序关闭时应调用
HttpSessionListener.sessionDestroyed()

在应用程序关闭时,侦听器将按照与其声明相反的顺序得到通知 在向上下文侦听器发送通知之前向会话侦听器发送通知。 必须在上下文侦听器之前通知会话侦听器会话无效 正在收到应用程序关闭的通知

Tomcat7实现了JavaServlet3.0规范,应该支持您的用例。

阅读我找到了这个问题的答案

我们能够编写ServletContextListener代码,以便在加载或终止上下文时触发,如下所示:

public class MyServlet implements ServletContextListener {

  public void contextInitialized(ServletContextEvent e) {
         // implementation code
  }

  public void contextDestroyed(ServletContextEvent e) {
         // implementation code
  }
}
现在,在您的例子中,将触发关闭,然后将调用contextDestroyed()方法

参考:


多亏了Garis Suero

但我如何才能释放会话中的资源(而不显式存储会话集合)?终止是什么意思?终止或关闭服务器?