2010-01-04 11 views
14

Estoy construyendo una aplicación web relativamente simple donde el servlet principal implementa la interfaz ServletContextListener para determinar si el contexto se ha iniciado o detenido. Implementé mis métodos contextInitialized, contextDestroyed, init y destroy (ambos init y llaman a super en la clase base). Actualmente no he implementado ninguna funcionalidad real que no sea la inicializada con log4j en el método contextInitialized donde cargo el archivo log4j.properties.Tomcat no se apaga dentro de Eclipse

Cuando inicio y detengo el servidor Tomcat desde Eclipse, todo se llama en el orden correcto (estoy usando algunos System.out.println para probar esto) pero después de unos 10 segundos de detener el servidor me presento Eclipse con un emergente que indica lo siguiente:

servidor Tomcat v6.0 servidor en localhost no responde. ¿Desea finalizar este servidor? Haga clic en Aceptar para finalizar el servidor o haga clic en Cancelar para continuar esperando.

Esto es lo que se imprime en mi consola de Eclipse cuando deje el servidor:

04/01/2010 7:39:13 PM org.apache.catalina.core.StandardService detener
INFO : detener servicio Catalina
contextDestroyed
04/01/2010 07:39:13 PM org.apache.coyote.http11.Http11Protocol destruir
INFORMACIÓN: Detener Coyote HTTP/1.1 en http-8080

Y después del último mensaje INFO, simplemente se cuelga hasta que aparece la ventana emergente. Si elijo esperar, presiono Cancelar, Eclipse se vuelve inutilizable y tengo que eliminar el proceso de Eclipse de una terminal.

Cualquier comentario sobre cómo resolver este problema sería muy apreciado.

ACTUALIZACIÓN:

El problema fue causado por un hilo no demonio que estoy empezando dentro de mi método init (olvidó mencionar que :). El problema se resolvió deteniendo explícitamente el hilo con el método stop, aunque ese método parece estar en desuso.

+0

Estoy realmente la primera persona en utilizar la etiqueta 'servlet'?!? – Luke

+0

'servlets' es la etiqueta más común, parece. :) – ZoogieZork

+0

Creo que esto sucede no solo dentro del eclipse, sino en general. Por lo que recuerdo, fue un problema con los recursos de log4j, google con eso en mente. – Bozho

Respuesta

5

Como se menciona en this thread, esto debería estar relacionado con un problema de limpieza.

Si una aplicación web no se limpia completamente, especialmente con respecto a la detención de subprocesos no dependientes, se iniciará, Tomcat no podrá apagarse.
Al hacer clic en "Detener" tiene la ventaja de proporcionar un tiempo de espera.
Si Tomcat no se detiene dentro del tiempo de espera, aparecerá un cuadro de diálogo que le brinda la opción de finalizar el servidor o continuar esperando.

+0

Su respuesta fue explosiva. He agregado una actualización a mi pregunta explicando la solución. ¡Gracias! – Luke

+1

bueno para mí, incluso cuando se produjo el tiempo límite y recibí un cuadro de diálogo, hice clic en forzar Tomcat para cerrar, incluso entonces no se cerró. Así que todavía estoy esperando que se cierre el servidor Tomcat. Sé que puedo ir directamente y matar al deamon, pero forzar el apagado (después del tiempo) también debe apagar el servidor. – user590849

0

Tuve un comportamiento similar. Si cerrar Tomcat no ayuda a tratar de encontrar otra consola activa desde la vista de la consola y matarla. En mi caso, ayuda.

+2

No es que no pueda matarlo/detenerlo. Quiero que se cierre correctamente sin que me dispare la cabeza. – Luke

0

En Windows, abra el Administrador de tareas y elimine el proceso javaw.

0

En Mac OS X, use el Monitor de actividad, forzar el proceso de salida de GrailsStarter. Preguntar

6

comando Abrir o PowerShell en Windows y escriba

netstat -nao 

encuentran pid de puerto correspondiente del resultado y escriba

taskkill /f /pid [port number] 
0

que estaba buscando a su actualización que resuelve su problema también , para todos los demás televidentes de esta pregunta, quiero darles un mejor enfoque. En lugar de usar detener, debe llamar a interrupción en el hilo y ajustar el código del método de ejecución en mientras el bucle que revisa! IsInterrupted(), siempre que se llame interrupción saldrá del bucle y el método ejecutará su procesamiento . Al igual que el ejemplo de abajo de mis otros 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

Ejemplos:

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 * 

Utilice este enlace https://technet.microsoft.com/en-us/library/bb491009.aspx

Cuestiones relacionadas