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
8
A
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>
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.
Funziona qui senza registrarlo. Usando Mojarra 2.3.3 su Payara 4.1 (173 build). – Roland
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
Grazie per aver chiarito. – Roland