2012-05-02 2 views
5

У нас есть несколько MemoryLeaks (найдено в файле catalina.out), перезагружая контекст.Tomcat ServletContextListener.contextDestroyed not called

Чтобы очистить эти потоки, я создал реализацию ServletContextListener.

Метод contextInitialized() успешно вызывается при создании контекста, поскольку я могу видеть записи журнала.

Но метод contextDestroyed() не вызывается, поэтому мой код очистки не вызывается. Есть идеи, почему это происходит?

Должен ли я реализовать другой интерфейс, который нужно заметить, когда необходимо перезагрузить контекст?

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 вызывает javax.servlet.ServletContextListener.contextDestroyed(), когда веб-приложение остановлено (если это не было серьезной ошибкой). Какие у вас есть доказательства того, что это не вызывается? –

+0

Только логфайлы и результирующие предупреждения MemoryLeaks. Пожалуйста, взгляните на реализацию. – Mirko

+0

Затем что-то в вашем коде сломано, так как Tomcat всегда вызывает методы contextDestroyed() зарегистрированных ServletContextListeners, когда веб-приложение остановлено. чтобы опубликовать код для вашего ServletContextListener и связанных журнальных выписок. –

ответ

0

Насколько я могу видеть, есть несколько вопросов:

  1. Сервлеты и фильтры уничтожены полностью, прежде чем contextDestroyed называется, так что это может быть слишком поздно для некоторых задач. Я не знаю, почему Tomcat сообщит о потенциальной утечке памяти, прежде чем называть этот метод. : -/
  2. Похоже, что загрузчик классов был отключен до того, как этот метод вызывается (потенциально также верно для метода destroy на фильтрах и сервлетах), что означает, что если ваш метод contextDestroyed нуждается в каких-либо классах, которые еще не были загружены, он потерпит неудачу. :-(