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