2009-05-29 11 views
5

Serwer Http osadzony w JDK 6 to duża pomoc przy tworzeniu serwisów internetowych, ale mam sytuację, w której opublikowałem punkt końcowy, a następnie kod się zawiesił i uruchomił serwer.Jak zamknąć serwer com.sun.net.httpserver.HttpServer?

Jak zamknąć serwer osadzony, gdy utracisz odniesienie do niego (lub opublikowanego punktu końcowego)?

+0

Jaki system operacyjny? – skaffman

+0

O/S to Windows. –

Odpowiedz

0

Nigdy wcześniej nie korzystałem z tego serwera i nie mogę znaleźć żadnej dobrej dokumentacji. Być może te mniej eleganckie rozwiązania już się pojawiły, ale pomyślałem, że o nich wspomnę.

Wygląda na to, że com.sun.net.httpserver.HttpServer ma klasę implementacji o nazwie HttpServerImpl. Ma metodę zwaną stop().

A może znajdziesz wątek nasłuchujący na gnieździe serwera i wywołaj przerwanie().

Sean

+0

Gdybym miał uchwyt do HttpServerImpl, mógłbym wywołać funkcję stop(), ale mam jeden proces tworzący HttpServer i chcę wywołać stop na tym innym procesie. –

+0

Err, to publiczne streszczenie void stop (...) bezpośrednio na klasie, więc gdzie jest problem? Zobacz: http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi

+0

Powinienem podać więcej Szczegół. Publikuję punkt końcowy w jednej maszynie JVM i jeśli operacja na punkcie końcowym ulega awarii, potrzebuję zamknąć serwer w innej maszynie JVM. Muszę połączyć się z portem administratora serwera, ale nie widzę niczego takiego jak gniazdo administratora dla osadzonego serwera. –

-1
netstat -a 

znaleźć PID procesu, który ma port otwarty (zakładając wiesz port), a

kill -9 $pid 

zabić proces.

+0

Domyślam się, że serwer działa jako wątek w JVM, więc sugerujesz, aby zestrzelić całą maszynę JVM. @Dean: Myślę, że szukasz czystszego rozwiązania, które nie wymaga restartowania maszyny JVM? – ShiDoiSi

0

A może nie utracić referencji? Kiedy mówisz, że twój kod się zawiesza, zakładam, że gdzieś masz wyjątek. Gdzie dokładnie? Więc osoba zdolna do przechwytywania tego wyjątku oczywiście musi również mieć odniesienie do HttpServera, który być może będziesz musiał przejść obok siebie.

Edytuj: Oh. W takim przypadku, jeśli nie chcesz zabić całej maszyny wirtualnej JVM za pomocą serwera HttpServer, musisz zaoferować pewne formy IPC dla środowiska, np. kanał poleceń za pośrednictwem RMI, który można wywołać z programu Java (i stąd Ant).

Innym rozwiązaniem byłoby, gdyby serwer nasłuchiwał jakiegoś "tajnego" zapytania cookie, w którym np. wydrukuj/zapisz plik cookie podczas uruchamiania, aby skrypt Ant mógł pobrać plik cookie, i możesz wystrzelić zapytanie do "tajnego" adresu URL, na którym serwer zakończy się z wdziękiem.

Poszedłbym z szybkim rozwiązaniem RMI.

+1

Jest to metoda main() w przykładowym kliencie, który publikuje punkt końcowy i wykonuje przykład. Jeśli się zawiesza, muszę mieć możliwość zamknięcia serwera przez Ant. Funkcja publikowania() i stop() byłaby wykonywana w innej maszynie JVM. –

8

używam poniższy kod, aby rozpocząć to

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

i poniżej kod, aby zatrzymać go

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

Aby uzyskać pełne zamknięcie, wykonaj: httpServer.stop (0); httpThreadPool.shutdown(); spróbuj { httpThreadPool.awaitTerminator (2, TimeUnit.HOURS); } catch (Exception e) {... shrieeeeek! ...} –