爲什麼sessionDestroyed()僅在無效或超時時調用,但在服務器終止時不調用?或者當服務器終止時如何在每個會話中進行一些操作?調用sessionDestroyed()當servet正在終止
回答
關於你提到的第一個問題:
爲什麼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.contextDestroyed
和Servlet.destroy
的ServletContextListener
接口提供了一個contextDestroyed
生命週期方法
Servlet接口提供了一種破壞方法,它是用來釋放任何資源或在服務器關閉時處理任何清理。
但我如何釋放會話中的資源(沒有顯式存儲會話集合)? – Hlib
的Java Servlet 3.0規範規定HttpSessionListener.sessionDestroyed()
應當在服務器/應用程序關閉調用(第11.3.4 通知在關機):
在應用程序關閉,聽衆以相反的順序來通知他們聲明 在向上下文偵聽器發送通知之前向會話偵聽器發送通知。 在上下文監聽器 被通知應用程序關閉之前,必須向會話監聽器通知會話無效。
Tomcat 7實現了Java Servlet 3.0規範,並且應該支持您的用例。
閱讀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()方法將被調用。
參考:
由於加里斯末郎
- 1. 系統調用正在終止
- 2. SessionListener sessionDestroyed not called
- 3. 在調用shell腳本中終止正在運行的程序
- 4. node.js - 調用回調是否終止當前函數
- 5. 當調用NSOpenPanel的runModal時,我的應用程序不會正確終止
- 6. 計劃終止()調用
- 7. 終止遞歸調用
- 8. 終止Lync中調用2010
- 9. Eclipse調試器在終止前停止
- 10. 我可以在sessionDestroyed中使用session.getAttribute()
- 11. 爲正常終止
- 12. 當調試停止時,VS2015不會終止IIS進程
- 13. 終止正在進行的過程和當前活動
- 14. 當從Python子進程終止時的C++調用函數
- 15. 當ctypes dll調用printf時python終止錯誤
- 16. 當我運行應用程序時xcode調試終止
- 17. 終止當前線程
- 18. HttpSessionListener - 會話超時時調用sessionDestroyed方法嗎?
- 19. 當地通知應用程序終止
- 20. 異步任務在App終止時停止(onDestroyed被調用)
- 21. 正常終止線程
- 22. 正確的greenlet終止
- 23. kubernetes的正常終止莢
- 24. SERVET請求失去了PARAMS
- 25. 進程終止回調
- 26. 當右側終止時,使管道的左側終止
- 27. '正確'終止WinForms應用程序
- 28. 正在運行Applescript:WorkFlowServiceRunner不會終止
- 29. 如何終止正在進行的SCNTransaction?
- 30. BACKUP DATABASE正在異常終止
你是什麼意思終止?殺死或關閉服務器? – dcernahoschi