2011-09-16 2 views
4

com.sun.httpserver.HttpServerおよびjavax.xml.ws.Endpointを使用して、既存のWSDL上でwsimportを実行し、genereatedサービスインターフェイスを実装することによって生成されたJAX-WS Webサービスを公開しています。これらはすべてJDK 1.6(JAX-WS RI 2.1.6)の一部です。追加のWebコンテナなしでJavaプログラムとして実行している私のWebサービスは、Apache Axisを使用して実装されたTomcatで実行されている既存のSOAPサービスをシミュレートすることになっています。既存のクライアントもApache Axisを使用して実装されています。JAX-WS Webサービスでは、各Soapコールが返された後にソケットを強制的に閉じる方法を教えてください。

私が抱えている問題は、クライアントからJAX-WSサービスへのSoap操作の呼び出しがしばらくの間ハングしてから、クライアントの側でソケットタイムアウトで終了することです。これは、JAX-WSサービスがすぐにSOAP応答を返すにもかかわらず発生します。

tcpdumpとwiresharkでパケットを調べると、既存のAxis Webサービスでは、SOAP応答がサーバーからクライアントに送信された後、サーバーはクライアントが応答する「FIN ACK」パケットを送信することに気付きました「FIN ACK」を含む。これにより、SOAP操作に関連するすべてのパケットが終了します。一方、JAX-WSサービスを使用して実行している場合、SOAP応答がクライアントに送信された後、サーバーは「FIN ACK」を送信しません。クライアントはソケット入力ストリームを読み続けるようです。

これは、SOAP呼び出しに対する応答が送信された後でも、JAX-WS Webサービススタックがソケットを開いたままにしていると考えています。そして、クライアントがSOAP操作の終わりにソケットを閉じることを期待しているようです。残念ながら、クライアントの動作を変更することはできません。

JAX-WSサービスを公開して各SOAP操作後に常にソケットを閉じるために使用するエンドポイントまたはHttpServerインスタンスを設定する方法はありますか?

システムプロパティhttp.keepAliveをfalseに設定しようとしましたが、これは何の違いもありませんでした。

ご協力いただきありがとうございます。

+0

'http.keepAlive'は' JAX-WS'がクライアント側のフードで使用する 'httpurlconnection'の設定のため動作しません – Cratylus

答えて

2

この問題を回避する方法を見つけましたが、それほどエレガントではありません。基本的に、HttpHandlerオブジェクトは、Endpoint.publish操作によって作成された後にHttpContextから取得されます。そして、私はhandle()メソッドを私が書いた別のHttpHandlerクラスから呼び出します。このメソッドは、 "Connection"を "close"に設定してHttpHeaderを送信することによってそれに従います。このような何かを:

... 
    HttpServer server = HttpServer.create(myInetSocketAddress, 5); 
    HttpContext context = server.createContext(mySoapPath); 
    Endpoint endpoint = Endpoint.create(mySoapImpl); 
    endpoint.publish(context); 

    MyHandler handler = new MyHandler(context.getHandler()); 
    server.removeContext(mySoapPath); 
    server.createContext(mySoapPath, handler); 
    server.start(); 
    ... 

    private class MyHandler implements HttpHandler { 
    private HttpHandler h; 
    public MyHandler(HttpHandler in) { 
     h = in; 
    } 
    public void handle(HttpExchange t) throws IOException { 
     h.handle(t); 
     t.getResponseHeaders().set("Connection", "close"); 
     t.sendResponseHeaders(200, 0); 
     t.close(); 
    } 
    } 

それは私の現在のニーズに合わせて動作しますが、それだけで良い方法があるように持っているように思えます。別の解決策がある場合は投稿してください。ありがとう!

+0

まったく同じ問題がありました。この問題は、Connection-headerが見つからない場合のjax-wsのバグと思われます。 Jaxは、クライアントがhttp 1.0を使用していてもキープアライブとみなします。これは明らかにw3 http specに違反します。 –

+1

私の編集を無視してください - 間違ったインポートがあったので、今削除する方法が見つかりません。 –

関連する問題