2012-03-29 23 views
5

Estoy usando ScheduledExecutorService para ejecutar subprocesos programados.
Implementé ServletContextListener.contextDestroyed e invoqué ScheduledExecutorService.shutdownNow y awaitTermination.Tomcat 7 y ScheduledExecutorService.shutdown

Aquí se muestra un ejemplo:

@Override 
public void contextDestroyed(ServletContextEvent servletcontextevent) { 
    pool.shutdownNow(); // Disable new tasks from being submitted 
    try { 
     // Wait a while for existing tasks to terminate 
     if (!pool.awaitTermination(50, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     System.err.println("Pool did not terminate"); 
     } 
    } catch (InterruptedException ie) { 
     // (Re-)Cancel if current thread also interrupted 
     pool.shutdownNow(); 
     // Preserve interrupt status 
     Thread.currentThread().interrupt(); 
    }   
} 


Sin embargo, yo estoy recibiendo el siguiente error de Tomcat 7:

GRAVES: La aplicación web [/ servlet] parece haber iniciado una thread llamado [Timer-0] pero no ha podido detenerlo. Esto es muy probable para crear una pérdida de memoria.

¿Se puede ignorar este registro? O estoy haciendo algo mal?

Gracias

+0

Quiero decir, mi pensamiento es: ¿dónde se detienen sus responsabilidades para hacer la limpieza? ¿Qué más se puede hacer aquí? Golpea la caja con una manguera de fuego? Con toda seriedad, lo que quiero decir es que parece que estás haciendo todo lo que puedes hacer ... Ignoraría ese error. – ControlAltDel

+0

Puedes consultar mi publicación anterior :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili

Respuesta

4

¿Estás seguro de que este error está relacionado con tu grupo de subprocesos? A juzgar por el nombre de la secuencia 'Timer-0', probablemente haya sido iniciado por algún tipo de temporizador.

Además, shutdownNow() debería devolverle la lista de Tareas que aún esperan la finalización (consulte JavaDoc). Podría construir lógica para esperar más si la lista no está vacía.

1

que se está cerrando correctamente abajo de su ScheduledExecutorService. Sin embargo, los hilos creados por ExecutorService de forma predeterminada siguen esta convención de nomenclatura: pool-X-thread-Y.

Timer-0 hilos creados por Timer clase. Búsquelos en su código y bibliotecas.

Cuestiones relacionadas