【发布时间】:2010-12-22 01:40:26
【问题描述】:
我有一个实现ServletContextListener 接口的Initializer 类。在它的contextInitialized()方法中,我初始化了一些必须销毁的全局类,否则无法卸载servlet。
然而,当 servlet 的 init() 方法抛出 ServletException 时,contextDestroyed() 方法永远不会被调用 --> 资源不会被释放 --> servlet 不会被 Tomcat 卸载(它仍然处于“运行状态”状态,即使它的 init 方法从未完成)。
我的问题是——在这种情况下如何清理资源?
奖励:为什么 servlet 甚至会进入“运行”状态?我从the documentation 了解到,除非init() 方法成功完成,否则它不应该运行。
编辑 - 我认为这是因为 Tomcat 管理器中显示的每个状态行都代表整个战争,而不是 servlet。一场战争可能包含多个 servlet,其中一些成功启动,而另一些则没有。 Initializer 在容器启动时被调用,它的destroy 仅在整个容器被丢弃时被调用。这就引出了一个相关的问题——是否有类似的内置方法来监控单个 servlet 的状态?
(我知道我可以编写自定义代码来监视 servlet,无论是否通过 JMX,但这超出了 这个问题)。
【问题讨论】: