2012-07-05 16 views
5

Mi situación es así:apagado de Tomcat MUY lento después de llamar a shutdown.sh?

Cada vez antes de cargar el archivo war a la carpeta de la aplicación web, dejo Tomcat llamando al sh shutdown.sh. Solía ​​tomar unos 30 segundos para un apagado total. Pero ahora ya no funciona bien.

En realidad, funcionó un poco, porque cuando accedo a la aplicación desde la página web arroja el error 503 (Bajo Mantenimiento). Pero cuando uso ps aux | grep tomcat para verificar, el proceso de tomcat aún está allí. Y estará allí por alrededor de 5 a 10 minutos.

Entiendo que puede necesitar tomar más tiempo para completar todas las tareas, pero es demasiado lento (5-10 minutos) antes de que se detenga por completo. No entiendo por qué sucede esto, pero debe haber alguna razón. Quizás haya algo que ver con el código o con el nuevo script de implementación que utilizamos recientemente. Simplemente no tengo ni idea de dónde comprobarlo.

Esto es importante para nuestro equipo porque estamos utilizando el "despliegue automático", en el cual usamos un script para autoensamblar el archivo war, cargarlo e implementarlo en un momento específico. Si iniciamos una nueva instancia de tomcat antes de que el anterior se cierre con éxito, se quedará allí para siempre, y limpiar la tarea con "kill -9" es desalentador.

¿Hay alguien que haya experimentado este problema? Cualquier pista sería apreciada.

+1

Q: ¿Cuál es la última cosa en el registro cuando lleva esta 5-10 minutos? TAMBIÉN: ¿"ps -eaf" le da alguna pista (o simplemente ve un proceso de Java con cero utilización de la CPU)? ¿Cuál es tu versión de Tomcat? Su sistema operativo? TAMBIÉN: si identifica un proceso "java" "colgado" en "ps", debe obtener un seguimiento de pila: http://wiki.apache.org/tomcat/HowTo#How_do_I_obtain_a_thread_dump_of_my_running_webapp_.3F – paulsm4

+0

@ paulsm4: Mirando el registro , Veo que incluso después de llamar a shutdown.sh, mis trabajos de Quartz aún se ejecutan. Después de un tiempo, se descarta un error: SEVERE: La aplicación web [/ project] parece haber iniciado un hilo llamado [Resource Destroyer in BasicResourcePool.close()] pero no ha podido detenerlo. Esto es muy probable que cree una pérdida de memoria. –

+0

@ paulsm4: por cierto, tengo el trabajo de cuarzo aproximadamente 10 segundos por vez. ¿Esto puede ser un problema? –

Respuesta

2

Hoàng Long -

Gracias por la actualización.

1) El hecho de que usted ve a sus puestos de trabajo de cuarzo funcionando, y el mensaje de error, son significativos:

GRAVES: La aplicación web [/ proyecto] parece haber comenzado una hilo llamado [Recurso Destructor en BasicResourcePool.close()] pero no ha podido detenerlo en . Esto es muy probable que cree una pérdida de memoria.

2) Una sugerencia es de configuración:

http://forum.springsource.org/showthread.php?17833-Spring-Quartz-Tomcat-no-shutdown

I tenían el mismo problema. Lo arreglé agregando destroy-method="destroy" a la definición de SchedulerFactoryBean. De esta manera, el resorte cierra el planificador cuando se detiene la aplicación .

3) Otra sugerencia es añadir un detector de apagado:

http://forums.terracotta.org/forums/posts/list/15/4341.page

Usando un oyente contexto y la introducción de un tiempo de espera en la parada resuelve el problema para mí. Sólo tiene que esperar un segundo después de cerrar:

public void contextDestroyed(ServletContextEvent sce) { 
    try { 
     factory.getScheduler().shutdown(); 
     Thread.sleep(1000); 
+0

Creo que me he dado cuenta: la razón principal es que todavía tengo en ejecución los trabajos de cuarzo de transacción. Sobre el tercer método de su respuesta, ¿quiere decir que debo anular Spring "ContextLoaderListener" para esta tarea? –