2011-11-18 74 views
8

我正在開發Java Web應用程序。該應用程序連接到Lucene索引。我創建了一個IndexSearcher的單例實例。這個實例打開一些文件。當我重新部署Web應用程序時,由較早的IndexSearcher實例打開的文件將繼續保持打開狀態,並且重新部署的應用程序會創建另一個實例。幾次重新部署後,系統開始拋出「太多打開的文件」異常。我想在重新部署之前關閉舊實例,以便舊文件關閉,但我無法弄清楚如何做到這一點? web.xml中是否存在需要取消部署的指令,與load-on-startup類似?我在jboss服務器上運行web應用程序。從Java Web應用程序取消部署的調用方法

回答

17

執行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> 
+0

它在這裏工作,無需註冊。在Payara 4.1上使用Mojarra 2.3.3(173 build)。 – Roland

+1

確定它會正常工作。 Payara 4.x是基於Servlet 3.1的。那麼'@ WebListener'就可以正常工作。正如所回答的那樣,當你還沒有使用Servlet 3.0時,它將不起作用。 JSF impl /版本無關緊要,因爲它在這裏不起作用。只有Servlet版本是相關的。 – BalusC

+0

謝謝你說清楚。 – Roland

2

如果您實施javax.servlet.ServletContextListener並將web.xml中的該類註冊爲<listener>,那麼將在上下文卸載之前調用contextDestroyed()方法。