2012-07-05 12 views
5

La mia situazione è simile a questa:Arresto di Tomcat MOLTO lento dopo aver chiamato shutdown.sh?

Ogni volta prima di caricare file di guerra nella cartella web-app, interrompo Tomcat chiamando lo sh shutdown.sh. Ci sono voluti circa 30 secondi per uno spegnimento totale. Ma ora non funziona più bene.

In realtà, ha funzionato, perché quando accedo all'applicazione da una pagina Web genera 503 errori (in Manutenzione). Ma quando uso il controllo ps aux | grep tomcat, il processo tomcat è ancora lì. E sarà lì per circa 5 - 10 minuti.

Capisco che potrebbe essere necessario prendere più volte per completare tutte le attività, ma è troppo lento (5 - 10 minuti), prima che si fermi completamente. Non capisco perché questo accada, ma ci deve essere un motivo. Forse c'è qualcosa a che fare con il codice o il nuovo script di distribuzione che abbiamo usato di recente. Non ho quasi nessuna idea su dove controllare.

Questo è importante per il nostro team perché stiamo utilizzando "auto-deployment", in cui utilizziamo uno script per auto-pacchetto di file war, caricamento e distribuzione in un momento specifico. Se avessimo iniziato una nuova istanza di tomcat prima che il vecchio si arrestasse con successo, rimarrà sospeso per sempre, e l'attività di ripulitura di "kill -9" è scoraggiante.

C'è qualcuno che ha sperimentato questo problema? Qualsiasi suggerimento sarebbe apprezzato.

+1

D: Allora, qual è l'ultima cosa al registro quando si sta prendendo questa 5-10 minuti? INOLTRE: fa "ps -eaf" fornirti degli indizi (o vedi semplicemente un processo Java con zero utilizzo della CPU)? Qual è la tua versione di Tomcat? Il tuo sistema operativo? ANCHE: se si identifica un processo "java" "sospeso" in "ps", si dovrebbe ottenere una traccia dello stack: http://wiki.apache.org/tomcat/HowTo#How_do_I_obtain_a_thread_dump_of_my_running_webapp_.3F – paulsm4

+0

@ paulsm4: guardando il registro , Vedo che anche dopo aver chiamato shutdown.sh, i miei processi Quartz continuano a funzionare. Dopo un po 'viene fuori un errore: SEVERE: l'applicazione web [/ project] sembra aver avviato un thread chiamato [Resource Destroyer in BasicResourcePool.close()] ma non è riuscito a fermarlo. È molto probabile che questo crei una perdita di memoria. –

+0

@ paulsm4: a proposito, ho il lavoro al quarzo eseguito circa 10 secondi alla volta. Questo può essere un problema? –

risposta

2

Hoàng Long -

Grazie per l'aggiornamento.

1) Il fatto che si vede i lavori di quarzo in esecuzione, e il messaggio di errore, sono entrambi significativi:

GRAVI: L'applicazione web [/ progetto] sembra aver iniziato una filo di nome [Risorsa Destroyer in BasicResourcePool.close()] ma ha non è riuscito a fermarlo. È molto probabile che questo crei una perdita di memoria.

2) Un suggerimento è di configurazione:

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

Ho avuto lo stesso problema. L'ho risolto aggiungendo destroy-method="destroy" alla definizione SchedulerFactoryBean. In questo modo la molla chiude lo scheduler quando l'applicazione è interrotta.

3) Un altro suggerimento è quello di aggiungere un listener di arresto:

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

Uso di un listener contesto e l'introduzione di un timeout allo spegnimento risolve il problema per me. Ho solo aspettare un secondo dopo lo spegnimento:

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

Penso di aver capito: il motivo principale è che ho ancora i processi di quarzo delle transazioni in esecuzione. Riguardo al 3 ° metodo della tua risposta, intendi che devo sostituire Spring "ContextLoaderListener" per questa attività? –

Problemi correlati