JDK 6 に組み込まれた Http サーバーは、Web サービスの開発に大いに役立ちますが、エンドポイントを公開した後、コードがクラッシュしてサーバーが実行されたままになる状況が発生しました。
組み込みサーバー (または公開されたエンドポイント) への参照を失った場合、組み込みサーバーをシャットダウンするにはどうすればよいですか?
JDK 6 に組み込まれた Http サーバーは、Web サービスの開発に大いに役立ちますが、エンドポイントを公開した後、コードがクラッシュしてサーバーが実行されたままになる状況が発生しました。
組み込みサーバー (または公開されたエンドポイント) への参照を失った場合、組み込みサーバーをシャットダウンするにはどうすればよいですか?
以下のコードを使用して開始します
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();
以下のコードで停止します
this.httpServer.stop(1);
this.httpThreadPool.shutdownNow();
How about not loosing the reference, then? When you say your code crashes, I assume you get an exception somewhere. Where exactly? So someone capable of intercepting this exception obviously needs to also have a reference to the HttpServer, which you might have to pass around yourself.
Edit: Oh. In that case if you don't want to kill the entire JVM with the HttpServer in it, then you will need to offer some form of IPC to the environment, e.g. a command channel via RMI that can be invoked from a Java program (and hence Ant).
Another solution would be to have the server listen for some "secret" cookie query, where you e.g. print/save the cookie on startup so that the Ant script can retrieve the cookie, and you can fire off a query to your "secret" URL upon which the server will exit itself gracefully.
I'd go with a quick RMI solution.
以前にこのサーバーを使用したことがなく、適切なドキュメントが見つかりません。おそらく、これらのあまり洗練されていない解決策はすでにあなたに思い浮かんだかもしれませんが、私はそれらについて言及したいと思いました.
com.sun.net.httpserver.HttpServer には HttpServerImpl という実装クラスがあるようです。stop() というメソッドがあります。
または、サーバーソケットでリッスンしているスレッドを見つけて、interrupt() を呼び出すことができます。
ショーン
netstat -a
ポートが開いているプロセスのpidを見つける(ポートを知っていると仮定して)、および
kill -9 $pid
プロセスを強制終了します。