2011-11-18 16 views
8

Java Webアプリケーションを開発中です。アプリケーションはLuceneインデックスに接続します。 IndexSearcherのシングルトンインスタンスを作成します。このインスタンスはいくつかのファイルを開きます。 Webアプリケーションを再デプロイすると、IndexSearcherの以前のインスタンスで開いたファイルは引き続き開いたままになり、再デプロイされたアプリケーションによって別のインスタンスが作成されます。いくつかの再デプロイ後、システムは「オープンファイルが多すぎます」例外をスローし始めます。再デプロイする前に古いインスタンスを閉じて、古いファイルが閉じられるようにしたいのですが、どうやってそれを行うのか分かりません。 load-on-startupと同様に、un-deploy時に呼び出されるweb.xmlにディレクティブがありますか?私は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. 
    } 

} 

あなたは、その後、あなたは次のように@WebListener注釈を削除し、web.xmlで手動で登録する必要があります(ただし2年間のうち、すでにある)まだサーブレット3.0でない場合:

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

登録なしでここで動作します。 Payara 4.1(173ビルド)でMojarra 2.3.3を使用する – Roland

+1

確かに正常に動作します。 Payara 4.xはServlet 3.1ベースです。それで '@ WebListener'はうまく動作します。あなたがまだサーブレット3.0にいないときは答えられたように、それは動作しません。 JSF impl/versionは、ここでは役割を果たさないため、無関係です。サーブレットのバージョンのみが関連しています。 – BalusC

+0

ありがとうございます。 – Roland

2

javax.servlet.ServletContextListenerを実装し、そのクラスをに<listener>として登録すると、コンテキストがアンロードされる前にcontextDestroyed()メソッドが呼び出されます。

関連する問題