2010-01-04 27 views
14

Sto costruendo un'applicazione web relativamente semplice in cui il servlet principale implementa l'interfaccia ServletContextListener per determinare se il contesto è stato avviato o arrestato. Ho implementato i miei metodi contextInitialized, contextDestroyed, init e destroy (entrambi init e destroy chiamare super nella classe base). Al momento non ho implementato alcuna funzionalità reale oltre a quella che ho inizializzato log4j nel metodo contextInitialized dove carico il file log4j.properties.Tomcat non si chiude in Eclipse

Quando avvio e fermo il server Tomcat da Eclipse, tuttavia, tutto viene chiamato nell'ordine corretto (sto usando alcuni System.out.println per testarlo) ma dopo circa 10 secondi di arresto del server mi viene presentato con un popup di Eclipse che indica quanto segue:

Server Tomcat v6.0 Server su localhost non risponde. Vuoi terminare questo server? Fare clic su OK per terminare il server o fare clic su Annulla per continuare ad attendere.

Questo è ciò che è stampato nella mia console Eclipse quando mi fermo Server:

04/01/2010 7:39:13 PM org.apache.catalina.core.StandardService fermare
INFO : Arresto del servizio Catalina
contextDestroyed
04/01/2010 19:39:13 org.apache.coyote.http11.Http11Protocol distruggere
INFORMAZIONI: Arresto Coyote HTTP/1.1 su http-8080

E dopo l'ultimo messaggio INFO si blocca lì finché non viene visualizzato il popup. Se scelgo di aspettare, premere Annulla, Eclipse diventa inutilizzabile e devo eliminare il processo Eclipse da un terminale.

Qualsiasi input su come risolvere questo problema sarebbe molto apprezzato.

UPDATE:

Il problema è stato causato da un filo non demone che sto iniziando nel mio metodo init (dimenticato di dire che :). Il problema è stato risolto interrompendo esplicitamente il thread con il metodo stop, anche se tale metodo sembra essere deprecato.

+0

Sto davvero la prima persona a utilizzare il tag 'servlet'?!? – Luke

+0

'servlet' è il tag più comune, a quanto pare. :) – ZoogieZork

+0

Penso che questo avvenga non solo all'interno di eclissi, ma in generale. Per quanto ricordo è stato un problema con le risorse log4j, google con questo in mente. – Bozho

risposta

5

Come indicato in this thread, questo dovrebbe essere correlato a un problema di pulizia.

Se una webapp non esegue la pulizia completamente, in particolare per quanto riguarda l'interruzione dei thread non daemon, viene avviato, Tomcat non verrà arrestato.
Fare clic su "Stop" ha il vantaggio di fornire un timeout.
Se Tomcat non si interrompe entro il timeout, viene visualizzata una finestra di dialogo che offre l'opzione di chiudere il server o continuare ad attendere.

+0

La tua risposta è stata perfetta. Ho aggiunto un aggiornamento alla mia domanda spiegando la soluzione. Grazie! – Luke

+1

bene per me anche quando il timout è successo e ho ottenuto una finestra di dialogo, ho cliccato forzare Tomcat a chiudere, anche se non si è chiuso. Quindi sto ancora aspettando la chiusura del server Tomcat. So che posso andare direttamente ad uccidere il demone, ma l'arresto forzato (dopo il timout) dovrebbe spegnere anche il server. – user590849

0

Ho avuto un comportamento simile. Se la chiusura di Tomcat non aiuta a cercare un'altra console attiva dalla console e ucciderla. Nel mio caso aiuta.

+2

Non è che non posso ucciderlo/fermarlo. Voglio che si spenga correttamente senza che lo spari anche se la testa. – Luke

0

Su Windows, aprire Task Manager e terminare il processo javaw.

0

Su Mac OS X, utilizzare Activity Monitor, forzare l'uscita dal processo GrailsStarter. Prompt

6

Comando Apri o PowerShell in Windows e digitare

netstat -nao 

trovare pid della porta corrispondente dal risultato e digitare

taskkill /f /pid [port number] 
0

stavo guardando l'aggiornamento che ha risolto il problema anche per tutti gli altri spettatori di questa domanda voglio dare un approccio migliore.

Invece di usare arresto u dovrebbe chiamare interrupt sulla filettatura e avvolgere codice di metodo fuga ciclo while che verifica! IsInterrupted(), ogniqualvolta interrupt è chiamato filo uscirà ciclo e metodo run completerà la sua trasformazione . Come l'esempio che segue dai miei altri answer

class Consumer implements Runnable{ 
    private BlockingQueue<Message> blockingQueue; 
    Consumer(BlockingQueue<Message> blockingQueue){ 
     this.blockingQueue=blockingQueue; 
    } 

    @Override 
    public void run(){ 
     while(!Thread.interrupted()){ 
      System.out.print("Concumer Started"); 
      try{ 
       Message message = blockingQueue.take(); 
       System.out.print("message Id"+message.messageId+" Consumed "); 
      } 
      catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
      System.out.println("Concumer Done"); 
     } 
    } 
} 
1

Esempi:

taskkill /pid 1230 /pid 1241 /pid 1253 
taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe 
taskkill /s srvmain /f /im notepad.exe 
taskkill /s srvmain /u maindom\hiropln /p [email protected] /fi "IMAGENAME eq note*" /im * 
taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im * 
taskkill /f /fi "PID ge 1000" /im * 

favore utilizza questo link https://technet.microsoft.com/en-us/library/bb491009.aspx

Problemi correlati