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");
}
}
}
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? –
Solo los archivos de registro y las advertencias de MemoryLeaks resultantes. Observe la implementación. – Mirko
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. –