2012-05-02 20 views
5

Tenemos varios MemoryLeaks (encontrados en catalina.out), mientras recargamos el contexto.Tomcat ServletContextListener.contextDestroyed no se llama

Para limpiar estos hilos, creé una implementación de ServletContextListener.

El método contextInitialized() se llama correctamente cuando se crea un contexto, porque puedo ver las entradas de registro.

Pero no se llama al método contextDestroyed(), por lo que no se invoca mi código de limpieza. ¿Alguna idea de por qué está pasando esto?

¿Debo implementar otra interfaz para notar cuando un contexto necesita ser recargado?

public class MyContextListener implements ServletContextListener { 

    private static final Logger log = Logger.getLogger(MyContextListener.class); 

    @Override 
    public void contextDestroyed(final ServletContextEvent arg0) { 
     MyContextListener.log.info("destroying Servlet Context"); 
     //Do stuff 
     MyContextListener.log.info("Servlet Context destroyed"); 
    } 

    @Override 
    public void contextInitialized(final ServletContextEvent arg0) { 
     try { 
      MyContextListener.log.info("Creating Servlet Context"); 
      //Do stuff 
     } finally { 
      MyContextListener.log.info("Servlet Context created"); 
     } 
    } 
} 
+0

Tomcat llama al javax.servlet.ServletContextListener.contextDestroyed() cuando se detiene una aplicación web (si no fuera eso, sería un error grave). ¿Qué evidencia tiene de que no es así? llamándose? –

+0

Solo los archivos de registro y las advertencias de MemoryLeaks resultantes. Observe la implementación. – Mirko

+0

Luego algo en su código se rompe ya que Tomcat siempre llama a los métodos contextDestroyed() de ServletContextListeners registrados cuando se detiene una aplicación web. para publicar el código de su ServletContextListener y los extractos de registro asociados. –

Respuesta

0

Por lo que yo puedo ver, hay un par de cuestiones:

  1. Los servlets y los filtros se destruyen por completo antes de contextDestroyed se llama, por lo que podría ser demasiado tarde para algunas tareas. No tengo ni idea de por qué Tomcat informaría sobre una posible pérdida de memoria antes de llamar a este método. : -/
  2. Parece que el cargador de clases se ha desactivado antes de llamar a este método (¿también es posible el método de destrucción en filtros y servlets?), Lo que significa que si su método contextDestroyed necesita alguna clase que no se haya cargado, fallará :-(