0

我们正在构建一个高吞吐量的后端系统,它将发送和检索可变大小的 byte[],一种缓存服务。绑定对于这个项目至关重要,因此我们一直在测试 SOAP、REST 和 Fast Infoset,并使用 Memcached 客户端作为我们的基线。

我们的测试没有显示 SOAP 和 Fast Infoset 客户端的往返时间有任何差异。我的消息不包含指示应用程序/fastinfoset 的标题信​​息。从我可以看到快速信息集没有打开,因为客户端没有发送正确的信息,因为 Metro 指南中的技术是错误的,或者我完全错过了一些东西。

难道我做错了什么?有更好的解决方案吗?

此站点上的 CXF 上有相同问题的解决方案,但它不是我可以使用的,我正在使用 Metro。请不要向我引用该解决方案。

这是有关如何工作的地铁指南:

  • 玻璃鱼 3.1.2
  • JDK 1.7
  • 地铁2.2

我测试中的两个客户端对一行代码的接受相同。

((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发生了变化,根据上面的metro guide参考应该是application/fastinfoset。这证明我没有遇到错误,而是存在文档问题。希望我能从这个论坛的好心专家那里找到答案。

这是我的消息的样子。我砍掉了二进制文件。请注意,服务没有任何指示表明与该客户端的继续通信应该是快速信息集。使用 Wireshark,我可以肯定地说,我发送到服务器的所有消息都没有任何标头信息来指示快速信息集。

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

只需要知道魔法咒语。

请在我也发布此问题的 glassfish 论坛上阅读以下解决方案。 http://home.java.net/forum/topic/glassfish/glassfish/fast-infoset-comparison-soap-not-faster

于 2012-09-14T15:17:22.360 回答