2012-05-02 13 views
5

Mamy posiadające wiele MemoryLeaks (znaleziono w catalina.out), podczas przeładowywania kontekst.Tomcat ServletContextListener.contextDestroyed nie nazywa

Aby oczyścić te wątki, stworzyłem implementację ServletContextListener.

Sposób contextInitialized() powodzeniem wywołana, gdy tworzony jest kontekst, bo widzę wpisy dziennika.

Ale metoda contextDestroyed() nie nazywa się tak mój kod porządki nie jest wywoływany. Jakieś pomysły, dlaczego tak się dzieje?

powinienem realizować innego interfejsu, aby być zauważonym, gdy potrzebuje kontekstu być przeładowane?

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 wywołuje javax.servlet.ServletContextListener.contextDestroyed(), gdy aplikacja internetowa jest zatrzymana (jeśli nie byłaby to poważna usterka). Jakie masz dowody, że nie jest ona miano? –

+0

Tylko Logfiles i wynikające MemoryLeaks-ostrzeżenia. Proszę spojrzeć na realizację. – Mirko

+0

Wtedy coś w kodzie jest uszkodzony ponieważ Tomcat zawsze wywołuje contextDestroyed() Metody zarejestrowanych ServletContextListeners gdy aplikacja internetowa jest zatrzymany. Czas aby umieścić kod na swojej ServletContextListener oraz związanych z ekstraktami z bali. –

Odpowiedz

0

O ile widzę, istnieje kilka kwestii:

  1. W serwlety i filtry są zniszczone całkowicie przed contextDestroyed nazywa, więc to może być za późno dla niektórych zadań. Nie mam pojęcia, dlaczego Tomcat zgłosiłby potencjalny wyciek pamięci przed wywołaniem tej metody. : -/
  2. Ładowarka klasa wydaje się być wyłączony, zanim metoda ta nazywana jest (? Potencjalnie również do sposobu zniszczenia na filtrach i apletów), co oznacza, że ​​jeśli contextDestroyed metoda wymaga żadnych klas, które nie zostały już załadowane, to się nie powiedzie. :-(