2009-05-29 12 views
5

El Servidor Http integrado en JDK 6 es una gran ayuda en el desarrollo de servicios web, pero tengo una situación en la que publiqué un Endpoint y luego el código se bloqueó y dejó el servidor en funcionamiento.Cómo cerrar com.sun.net.httpserver.HttpServer?

¿Cómo se cierra el servidor incorporado una vez que se pierde la referencia (o el punto final publicado)?

+0

qué sistema operativo? – skaffman

+0

El O/S es Windows. –

Respuesta

0

Nunca he usado este servidor antes y no puedo encontrar ninguna buena documentación. Quizás estas soluciones menos elegantes ya se te ocurrieron, pero pensé que las mencionaría.

Parece que com.sun.net.httpserver.HttpServer tiene una clase de implementación llamada HttpServerImpl. Tiene un método llamado stop().

O tal vez usted puede encontrar el hilo que escucha en el zócalo del servidor y llamar a la interrupción().

Sean

+0

Si tuviera un identificador para HttpServerImpl podría llamar a stop() en él, pero tengo un proceso que crea HttpServer y quiero llamar a detenerlo con otro proceso. –

+0

Err, es la parada de vacío abstracta pública (...) en la clase directamente, entonces, ¿dónde está el problema? Ver: http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi

+0

Debería haber proporcionado más detalle. Publico un punto final en una JVM y si una operación en el punto final falla, necesito cerrar el servidor en una JVM diferente. Necesito llamar al puerto de administración del servidor, pero no veo nada como un socket de administrador para el servidor embebido. –

-1
netstat -a 

para encontrar el pid del proceso que tiene el puerto abierto (suponiendo que conoce el puerto), y

kill -9 $pid 

para matar el proceso.

+0

Supongo que el servidor se ejecuta como un hilo en la JVM, por lo que está sugiriendo que derribe todo el JVM. @Dean: ¿Creo que está buscando una solución más limpia que no requiera reiniciar la JVM? – ShiDoiSi

0

¿Qué tal si no se pierde la referencia, entonces? Cuando dices que tu código falla, supongo que obtienes una excepción en alguna parte. ¿Donde exactamente? Entonces, alguien que sea capaz de interceptar esta excepción obviamente también necesita tener una referencia al HttpServer, que tal vez tenga que pasar por su cuenta.

Editar: Oh. En ese caso, si no desea eliminar la JVM completa con HttpServer, deberá ofrecer algún tipo de IPC al entorno, p. un canal de comando a través de RMI que se puede invocar desde un programa Java (y, por lo tanto, Ant).

Otra solución sería hacer que el servidor escuche alguna consulta de cookie "secreta", donde, por ejemplo, imprima/guarde la cookie al inicio para que la secuencia de comandos Ant pueda recuperar la cookie, y puede lanzar una consulta a su URL "secreta" sobre la que el servidor saldrá con elegancia.

Iré con una solución rápida de RMI.

+1

Es el método main() en un cliente de ejemplo que publica el punto final y ejecuta el ejemplo. Si se bloquea, necesito poder apagar el servidor a través de Ant. La publicación() y stop() se realizarán en una JVM diferente. –

8

uso el siguiente código para iniciarlo

this.httpServer = HttpServer.create(addr, 0); 
    HttpContext context = this.httpServer.createContext("/", new DocumentProcessHandler()); 
    this.httpThreadPool = Executors.newFixedThreadPool(this.noOfThreads); 
    this.httpServer.setExecutor(this.httpThreadPool); 
    this.httpServer.start(); 

y por debajo de código para detenerlo

 this.httpServer.stop(1); 
     this.httpThreadPool.shutdownNow(); 
+0

Para un cierre ordenado, hazlo: httpServer.stop (0); httpThreadPool.shutdown(); try { httpThreadPool.awaitTerminator (2, TimeUnit.HOURS); } catch (Excepción e) {... shrieeeeek! ...} –