2009-05-29 10 views
5

JDK 6に組み込まれたHttp Serverは、Webサービスを開発するのに大きな助けになりますが、私はエンドポイントを公開してコードがクラッシュし、com.sun.net.httpserver.HttpServerをシャットダウンする方法は?

組み込みサーバーの参照(または公開されたエンドポイント)が失われたら、どのように組み込みサーバーをシャットダウンしますか?

+0

どのオペレーティングシステムを停止する

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

とコードの下にそれを起動するために以下のコードを使うのか? – skaffman

+0

O/SはWindowsです。 –

答えて

0

私はこれまでこのサーバーを使用したことがなく、良い文書は見つかりませんでした。たぶん、あまりにも洗練されていないこれらの解決策はすでにあなたに起こっていたかもしれませんが、

com.sun.net.httpserver.HttpServerのように見えるのは、HttpServerImplという実装クラスです。これにはstop()というメソッドがあります。

スレッドをサーバーソケットでリッスンしてinterrupt()を呼び出すことができます。

ショーン

+0

HttpServerImplのハンドルを持っていたら、stop()を呼び出すことができましたが、HttpServerを作成するプロセスが1つあり、別のプロセスでそのプロセスを停止したいと思っています。 –

+0

Err、クラスに直接publicなvoid stop(...)がありますが、どこに問題がありますか?参照してください:http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi

+0

私はもっと提供しているはずです詳細。あるJVMにエンドポイントを公開し、エンドポイントの操作がクラッシュした場合、別のJVMでサーバーをシャットダウンする必要があります。私はサーバーの管理ポートを呼び出す必要がありますが、埋め込みサーバーの管理ソケットのようなものは表示されません。 –

-1
netstat -a 

は、プロセスを殺すために(あなたがポートを知っていると仮定して)開いているポートを持っているプロセスのpid、および

kill -9 $pid 

を見つけます。

+0

私は、サーバーがJVMのスレッドとして実行されると推測しています。そのため、JVM全体を大金持ちにすることを提案しています。 @Dean:JVMを再起動する必要がない、より洗練されたソリューションを探していると思いますか? – ShiDoiSi

0

リファレンスを失うことはありませんか?あなたのコードがクラッシュすると言うと、どこかで例外が発生すると思います。正確にはどこで?したがって、この例外を傍受できる人は明らかにHttpServerへの参照が必要です.HttpServerは自分自身を渡す必要があります。

:Oh。その場合、JVM全体でHttpServerを使用してJVMを強制終了したくない場合は、環境にいくつかの形式のIPCを提供する必要があります。 Javaプログラム(したがってAnt)から呼び出せるRMIを介したコマンドチャネル。

もう1つの解決策は、サーバーに「秘密の」Cookieクエリを聞かせることです。 Antスクリプトがクッキーを取得できるように、起動時にクッキーを表示/保存します。サーバーが正常に終了する「シークレット」URLに対してクエリを実行することができます。

私は簡単なRMIソリューションを利用したいと思います。

+1

エンドポイントを公開してそのサンプルを実行するのは、サンプルクライアントのmain()メソッドです。クラッシュした場合は、Ant経由でサーバをシャットダウンする必要があります。 publish()とstop()は別のJVMで実行されます。 –

8

私はそれを

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

正常なシャットダウンを行うには、次のようにします。 httpServer.stop(0); httpThreadPool.shutdown(); try { httpThreadPool.awaitTerminator(2、TimeUnit.HOURS); } catch(例外e){... shrieeeeek!...} –

関連する問題