2009-05-29 14 views
5

Il server Http incorporato in JDK 6 è un grande aiuto nello sviluppo di servizi Web, ma ho una situazione in cui ho pubblicato un endpoint e quindi il codice si è bloccato e ha lasciato il server in esecuzione.Come spegnere com.sun.net.httpserver.HttpServer?

Come arrestare il server incorporato una volta perso il riferimento (o l'endpoint pubblicato)?

+0

Che sistema operativo? – skaffman

+0

L'O/S è Windows. –

risposta

0

Non ho mai usato questo server prima e non riesco a trovare alcuna documentazione valida. Forse queste soluzioni meno eleganti ti sono già venute in mente, ma ho solo pensato di menzionarle.

Sembra com.sun.net.httpserver.HttpServer ha una classe di implementazione denominata HttpServerImpl. Ha un metodo chiamato stop().

O forse è possibile trovare il thread in ascolto sulla presa del server e chiamare interrupt().

Sean

+0

Se avessi un handle per HttpServerImpl potrei chiamare stop() su di esso, ma ho un processo che crea HttpServer e voglio chiamarlo per fermarlo con un altro processo. –

+0

Err, è pubblico astratto void stop (...) sulla classe direttamente, quindi dov'è il problema? Vedi: http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi

+0

Avrei dovuto fornire di più dettaglio. Pubblico un endpoint in una JVM e se un'operazione sull'endpoint si interrompe, è necessario arrestare il server in una JVM diversa. Devo chiamare la porta di amministrazione del server, ma non vedo nulla di simile a un socket di amministrazione per il server embed. –

-1
netstat -a 

per trovare il pid del processo che ha la porta aperta (supponendo che si conosce il porto), e

kill -9 $pid 

per uccidere il processo.

+0

Direi che il server funziona come un thread nella JVM, quindi stai suggerendo di abbattere pesantemente l'intera JVM. @Dean: Penso che tu stia cercando una soluzione più pulita che non richieda il riavvio della JVM? – ShiDoiSi

0

Che ne dici di non perdere il riferimento, quindi? Quando dici che il tuo codice si blocca, presumo che tu riceva un'eccezione da qualche parte. Dove esattamente? Quindi, qualcuno in grado di intercettare questa eccezione, ovviamente, deve anche avere un riferimento a HttpServer, che potrebbe essere necessario aggirare.

Modifica: Oh. In tal caso, se non vuoi uccidere l'intera JVM con HttpServer al suo interno, dovrai offrire qualche forma di IPC all'ambiente, ad es. un canale di comando tramite RMI che può essere richiamato da un programma Java (e quindi Ant).

Un'altra soluzione sarebbe quella di fare in modo che il server ascolti alcune query "segrete" sui cookie, dove ad es. stampa/salva il cookie all'avvio in modo che lo script Ant possa recuperare il cookie, e puoi licenziare una query al tuo URL "segreto" sul quale il server uscirà con grazia.

Vorrei andare con una soluzione RMI veloce.

+1

È il metodo main() in un client di esempio che pubblica l'endpoint ed esegue l'esempio. Se si blocca, devo essere in grado di spegnere il server tramite Ant. Publish() e stop() verrebbero eseguiti in una JVM diversa. –

8

Io uso il codice qui sotto per avviarlo

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(); 

e sotto il codice per fermarlo

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

Per un arresto regolare, fare: httpServer.stop (0); httpThreadPool.shutdown(); try { httpThreadPool.awaitTerminator (2, TimeUnit.HOURS); } catch (Exception e) {... shrieeeeek! ...} –

Problemi correlati