2011-11-18 5 views
8

Sto sviluppando un'applicazione Web Java. L'applicazione si connette a un indice di Lucene. Creo un'istanza singleton di IndexSearcher. Questa istanza apre alcuni file. Quando si ridistribuisce l'applicazione Web, i file aperti dall'istanza precedente di IndexSearcher continuano a rimanere aperti e un'altra applicazione viene creata dall'applicazione ridistribuita. Dopo alcuni redeploys, il sistema inizia a lanciare un'eccezione "troppi file aperti". Vorrei chiudere la vecchia istanza prima di ridistribuire, in modo che i vecchi file siano chiusi, ma non riesco a capire come farlo? Esiste una direttiva in web.xml chiamata on-deploy, simile a load-on-startup? Sto eseguendo l'applicazione web su un server jboss.Metodo di chiamata su annullamento della distribuzione da un'applicazione Web Java

risposta

17

Implementare uno 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. 
    } 

} 

Se non sei su Servlet 3.0 ancora (che è già fuori per 2 anni però), quindi è necessario rimuovere il @WebListener annotazione e registrarlo manualmente web.xml come segue:

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

Funziona qui senza registrarlo. Usando Mojarra 2.3.3 su Payara 4.1 (173 build). – Roland

+1

Certo che funzionerà bene. Payara 4.x è basato su Servlet 3.1. Quindi '@ WebListener' funzionerà perfettamente. Come risposta, non funzionerà quando non si è ancora su Servlet 3.0. L'impl/versione di JSF è irrilevante in quanto non svolge alcun ruolo qui. Solo la versione Servlet è rilevante. – BalusC

+0

Grazie per aver chiarito. – Roland

2

Se si implementa javax.servlet.ServletContextListener e si registra tale classe in web.xml come <listener>, verrà chiamato il metodo contextDestroyed() prima che il contesto venga scaricato.