2011-11-18 15 views
8

Estoy desarrollando una aplicación web Java. La aplicación se conecta a un índice Lucene. Creo una instancia singleton de IndexSearcher. Esta instancia abre algunos archivos. Cuando vuelvo a desplegar la aplicación web, los archivos abiertos por la instancia anterior de IndexSearcher continúan abiertos y la aplicación redistribuida crea otra instancia. Después de algunas reubicaciones, el sistema comienza a arrojar una excepción de "demasiados archivos abiertos". Me gustaría cerrar la instancia anterior antes de volver a desplegarla, para que los archivos antiguos estén cerrados, pero no puedo encontrar la manera de hacerlo. ¿Existe una directiva en web.xml que se invoque al deshacer implementación, similar a load-on-startup? Estoy ejecutando la aplicación web en un servidor jboss.Método de llamada en undeploy desde una aplicación web Java

Respuesta

17

Implemente un 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. 
    } 

} 

Si no estás en Servlet 3.0 todavía (que ya se encuentra a cabo durante 2 años sin embargo), entonces usted necesita para eliminar la anotación @WebListener y registrar manualmente en web.xml de la siguiente manera:

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

Funciona aquí sin registrarlo. Usando Mojarra 2.3.3 en Payara 4.1 (173 compilación). – Roland

+1

Seguro que funcionará bien. Payara 4.x está basado en Servlet 3.1. Entonces el '@ WebListener' funcionará bien. Como se respondió, no funcionará cuando todavía no tengas Servlet 3.0. La versión/imp/JSF es irrelevante ya que no juega un papel aquí. Solo la versión de Servlet es relevante. – BalusC

+0

Gracias por dejarlo en claro. – Roland

2

Si implementa javax.servlet.ServletContextListener y registra esa clase en web.xml como <listener>, se llamará al método contextDestroyed() antes de que se descargue el contexto.

Cuestiones relacionadas