2012-05-02 4 views
5

Abbiamo più MemoryLeaks (trovati nel catalina.out), mentre ricarico il contesto.Tomcat ServletContextListener.contextDestroyed non chiamato

Per pulire questi thread, ho creato un'implementazione di ServletContextListener.

Il metodo contextInitialized() viene richiamato correttamente quando viene creato un contesto, poiché è possibile visualizzare le voci del registro.

Ma il metodo contextDestroyed() non viene chiamato, quindi il mio codice di pulizia non viene richiamato. Qualche idea per cui questo sta accadendo?

Devo implementare un'altra interfaccia per essere notata quando è necessario ricaricare un contesto?

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 chiama javax.servlet.ServletContextListener.contextDestroyed() quando un'applicazione Web viene arrestata (se ciò non comporterebbe un bug grave). Che prove hai che non è –

+0

Solo i file di registro e gli avvertimenti di MemoryLeaks risultanti. Dai un'occhiata all'implementazione – Mirko

+0

Quindi qualcosa nel codice è stato interrotto poiché Tomcat chiama sempre i metodi contextDestroyed() di ServletContextListeners registrati quando un'applicazione Web viene arrestata. per pubblicare il codice per ServletContextListener e gli estratti associati del registro. –

risposta

0

Per quanto posso vedere, ci sono un paio di questioni:

  1. Le servlet e filtri vengono distrutti completamente prima contextDestroyed è chiamato, quindi potrebbe essere troppo tardi per alcune attività. Non ho idea del motivo per cui Tomcat segnalerebbe una potenziale perdita di memoria prima di chiamare questo metodo. : -/
  2. Il programma di caricamento classi sembra essere stato disabilitato prima che venga chiamato questo metodo (potenzialmente valido anche per il metodo destroy su filtri e servlet?), Ovvero se il metodo contextDestroyed richiede classi non ancora caricate, fallirà. :-(