从Java Web应用程序调用取消部署的方法

时间:2011-11-18 15:33:35

标签: servlets jboss web.xml

我正在开发一个Java Web应用程序。该应用程序连接到Lucene索引。我创建了一个IndexSearcher的单例实例。此实例打开一些文件。当我重新部署Web应用程序时,由早期的IndexSearcher实例打开的文件将继续保持打开状态,并且重新部署的应用程序将创建另一个实例。经过一些重新部署后,系统开始抛出“太多打开文件”异常。我想在重新部署之前关闭旧实例,以便关闭旧文件,但我无法弄清楚如何做到这一点? web.xml中是否有一个指令取消部署,类似于load-on-startup?我在jboss服务器上运行web应用程序。

2 个答案:

答案 0 :(得分:21)

实施ServletContextListener

@WebListener
public class LuceneConfig implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Do your job here during webapp startup.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do your job here during webapp shutdown.
    }

}

如果您尚未使用Servlet 3.0(已经有2年了),那么您需要删除@WebListener注释并在web.xml中手动注册,如下所示:

<listener>
    <listener-class>com.example.LuceneConfig</listener-class>
</listener>

答案 1 :(得分:2)

如果您实施javax.servlet.ServletContextListener并在web.xml中将该类注册为<listener>,则在卸载上下文之前将调用contextDestroyed()方法。