我有一個Initializer
類實現ServletContextListener
接口。在其contextInitialized()
方法中,我初始化了一些必須銷燬的全局類,否則無法卸載該servlet。如果init()失敗,清理servlet後
然而,當servlet的init()
方法拋出ServletException
,該contextDestroyed()
方法不會被調用 - >資源沒有被釋放 - > servlet沒有得到由Tomcat的卸載(它仍然在「運行」狀態,即使其init
方法從未完成)。
我的問題是這樣的 - 我如何在這種情況下清理資源?
獎勵:爲什麼servlet甚至會進入「運行」狀態?我從the documentation瞭解到,除非init()
方法成功完成,否則它不應該運行。
編輯 - 我認爲這是因爲Tomcat管理器中顯示的每個狀態行代表整個戰爭,而不是一個servlet。一場戰爭可能包含多個servlet,其中一些成功啓動,另一些則不成功。在容器啓動時調用Initializer
,並且僅當整個容器被丟棄時才調用它的銷燬。這導致了一個相關的問題 - 是否有類似的內置方法來監視單個servlet的狀態? (我知道我可以通過JMX編寫自定義代碼來監視servlet,但這不在 這個問題的範圍之內)。
根據[ServletContextListener]的javadoc(http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContextListener。html)中,contextInitialized方法是在「Web應用程序中的任何過濾器或servlet被初始化之前」驅動的,這與方法名稱中過去式可能導致您相信的內容相反。 – 2013-06-18 10:06:54