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
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
Puedes consultar mi publicación anterior :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili