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