2012-08-28 25 views

回答

2

關於你提到的第一個問題:

爲什麼sessionDestroyed()呼籲只在無效或超時,而不是打電話時服務器終止?

這就是爲什麼sessionDestroyed()在Tomcat中(至少在Tomcat的6.0.33的)關閉時是沒有得到調用,從一個崗位上的Tomcat的解釋:http://comments.gmane.org/gmane.comp.jakarta.tomcat.user/215644

當我要求我的web應用程序我收到sessionCreated,當我 無效的代碼我接收sessionDestroyed。 不幸的是,當我停止Web應用程序時,我沒有收到 sessionDestroyed。

我檢查了停止StandardContext的代碼。我可以看到 StandardManager.stop被調用哪個沒有問題 但是當調用StandardManager.doUnload()時,在其實現* session.expire(false)*被調用時,其中「false」實際上是 指示的標誌是否通知聽衆。因爲它被調用 「false」 - 偵聽器不會被調用。

這不是我的文章,我是歸功於文章作者Violeta。

該帖子提供了一種方法來修補StandardManager.java

如果您不想修改該類(我個人避免修改屬於應用服務器的類,只要有可能)就可以採用其他方法。

關於你提到的第二個問題:

我怎麼可以在每個會議提出的一些操作時,服務器終止?

爲什麼你想在服務器終止時在每個會話上執行操作? Servlet規範提供了在服務器關閉時執行代碼的方法。但是,它們不提供可以在每個活動會話上執行操作的手段(可能通過設計)。

正如前面的回答中提到的,How to access HTTP sessions in Java,會話管理應由Servlet容器處理,並且您可能會重新考慮您當前的應用方法。

對於一般的處理清理當服務器被關閉,則必須ServletContextListener.contextDestroyedServlet.destroy

ServletContextListener接口提供了一個contextDestroyed生命週期方法

Servlet接口提供了一種破壞方法,它是用來釋放任何資源或在服務器關閉時處理任何清理。

+0

但我如何釋放會話中的資源(沒有顯式存儲會話集合)? – Hlib

5

的Java Servlet 3.0規範規定HttpSessionListener.sessionDestroyed()應當在服務器/應用程序關閉調用(第11.3.4 通知在關機):

在應用程序關閉,聽衆以相反的順序來通知他們聲明 在向上下文偵聽器發送通知之前向會話偵聽器發送通知。 在上下文監聽器 被通知應用程序關閉之前,必須向會話監聽器通知會話無效。

Tomcat 7實現了Java Servlet 3.0規範,並且應該支持您的用例。

2

閱讀Execute code after Glassfish Web Deployment我來到這個問題的答案。

我們要編寫一個的ServletContextListener的能力,當上下文被加載或終止這樣被觸發:

public class MyServlet implements ServletContextListener { 

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

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

現在你的情況,其中一個關機將trigered,那麼contextDestroyed()方法將被調用。

參考:

由於加里斯末郎