0

キャッシュサービスである可変サイズのbyte[]を送受信する、高スループットのバックエンドシステムを構築しています。このプロジェクトではバインディングが重要であるため、SOAP、REST、およびFast Infosetをテストし、Memcachedクライアントをベースラインとして使用しています。

私たちのテストでは、SOAPクライアントとFastInfosetクライアントのラウンドトリップ時間の違いは明らかになりません。私のメッセージには、application/fastinfosetを示すヘッダー情報が含まれていません。メトロガイドのテクニックが間違っているか、私が完全に見逃していることがあるために、クライアントが正しい情報を送信していないため、FastInfosetがオンになっていないことがわかります。

私は何か間違ったことをしていますか?より良い解決策はありますか?

このサイトのCXFにも同じ問題の解決策がありますが、それは私が使用できるものではなく、Metroを使用しています。その解決策を私に参照しないでください。

これがどのように機能するかについてのメトロガイドは次のとおりです。

  • Glassfish 3.1.2
  • jdk 1.7
  • メトロ2.2

私のテストの2つのクライアントは、1行のコードを同じように受け入れます。

((javax.xml.ws.BindingProvider) _port).getRequestContext().put(JAXWSProperties.CONTENT_NEGOTIATION_PROPERTY, "pessimistic");

高速インフォセットクライアントのクライアントコードは次のようになります。(上記の行を引くだけで、soapクライアントがどのように見えるかがわかります。)上記のリンクのガイドは、JAXWSクライアントがFastInfosetを使用できるようにするために必要なのは上記の行だけであることを示しています。

 public EpCacheFiClient(long period) {      
     try {          
          _service = new EpCacheService(new URL(WSDL_URL_KEY), QNAME);
          _port = _service.getEpCachePort();            
          ((javax.xml.ws.BindingProvider) _port).getRequestContext().put(JAXWSProperties.CONTENT_NEGOTIATION_PROPERTY, "pessimistic");          
          if (_port != null) {              
               System.out.println("Found service port!");           
          } else {              
                 System.exit(128);          
          }     
     } catch (MalformedURLException e) {            
          e.printStackTrace();      
     }
}

メッセージングレベルでのプロトコルの詳細に入るituからのチュートリアルがあります。その中に、私のヘッダーがどのように見えるべきかのサンプルがあります。

POST /AlertPort HTTP/1.1
Content-Type: application/fastsoap; action="urn:alert"
Accepts: application/fastsoap, application/text+xml
Content-Length: ....
... sequence of octets …"

チュートリアルは2005年のものであり、HTTPヘッダーフィールドのContent-Typeが変更されていることがわかっています。これは、上記のメトロガイドリファレンスに従ってapplication/fastinfosetである必要があります。これは、私がバグを経験していないことの証拠ですが、ドキュメントの問題があります。うまくいけば、私はこのフォーラムの親切な専門家から知るでしょう。

これが私のメッセージの様子です。バイナリを切り落としました。このクライアントとの継続的な通信が高速インフォセットである必要があるというサービスへの表示がないことに注意してください。Wiresharkを使用すると、サーバーに送信したメッセージには、FastInfosetを示すヘッダー情報が含まれていなかったと断言できます。

POST /epcache/EpCacheService HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml;charset=utf-8
SOAPAction: "urn:ProcessEpCacheSet"
User-Agent: JAX-WS RI 2.2.4-b01
Host: linux-xxxxx:8080
Connection: keep-alive

また、BindingProviderのリクエストコンテキストに好きなものを入れることができ、すべてのリクエストのヘッダーに表示されるので、テストで_portをインスタンス化しても問題がないことにも注意したいと思います。

4

1 に答える 1

2

私は何が起こっているのかを見つけました。それは図書館でした。正しい文字列を使用していれば、推奨されるコマンドと手法が機能していたはずです。残念ながら、ドキュメントは内部ライブラリと外部ライブラリを区別しておらず、非推奨の列挙を使用しています。

つまり、JDK に組み込まれた jax-ws を使用する場合は、このプロパティを使用します [1]。それ以外の場合は、[2] を試してください。

[1] com.sun.xml.internal.ws.client.ContentNegotiation [2] com.sun.xml.ws.client.ContentNegotiation

必要なのは、魔法の呪文を知ることだけです。

この質問も投稿したグラスフィッシュ フォーラムで、次の解決策をお読みください。 http://home.java.net/forum/topic/glassfish/glassfish/fast-infoset-comparison-soap-not-faster

于 2012-09-14T15:17:22.360 に答える