2011-04-19 26 views
7

¿Cómo apagar programáticamente el servidor de embarcadero integrado?Apagado programático de embarcadero

empiezo servidor de amarre así:

Server server = new Server(8090); 
... 
server.start(); 
server.join(); 

Ahora, yo quiero que apagarlo de una solicitud, como http://127.0.0.1:8090/shutdown ¿cómo lo hago de forma limpia?

La solución comúnmente propuesta es crear un hilo y llamar a server.stop() desde este hilo. Pero posiblemente necesite una llamada a Thread.sleep() para asegurarme de que el servlet haya terminado de procesar la solicitud de apagado.

+3

Qué irónico es que el primer resultado de google es una pregunta en este sitio que responde a su pregunta: http://stackoverflow.com/questions/4650713/jetty-stopping-programatically-causes-1-threads-could-not-be -stopped –

+1

¿Cómo se inicia? Proporcione un poco más de información sobre el medio ambiente y obtendrá mejores respuestas – Kennet

+1

Irónico, sí. Pero no es una solución limpia. Usando esta solución necesito encontrar un tiempo de suspensión correcto antes de llamar a server.stop(). –

Respuesta

2

Probar server.setGracefulShutdown(stands_for_milliseconds);.

Creo que es similar a thread.join(stands_for_milliseconds);.

1

No se recomienda tener la capacidad de apagar un servidor Jetty de forma remota a través de una solicitud HTTP, ya que proporciona una posible amenaza a la seguridad. En la mayoría de los casos, debería ser suficiente para SSH para el servidor de alojamiento y ejecutar un comando apropiado allí para apagar una instancia respectiva de un servidor Jetty.

La idea básica es iniciar un hilo por separado como parte del código de inicio Jetty (así no hay necesidad de dormir como se requiere en uno de los mencionados en las respuestas de comentario) que serviría como hilo de servicio para manejar solicitudes de cierre. En este hilo, un ServerSocket podría vincularse a localhost y a un puerto designado, y cuando se reciba un mensaje esperado, llamaría al server.stop().

This publicación en el blog proporciona una discusión detallada utilizando el enfoque anterior.

6

He encontrado un método limpio muy limpio here

El fragmento de código mágica es: -

 server.setStopTimeout(10000L);; 
     try { 
      new Thread() { 
       @Override 
       public void run() { 
        try { 
         context.stop(); 
         server.stop(); 
        } catch (Exception ex) { 
         System.out.println("Failed to stop Jetty"); 
        } 
       } 
      }.start(); 

Debido a que el cierre se está ejecutando desde un hilo separado, que no se dispara por encima de sí mismo.