我有一个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