Fast Infoset不适用于JAXWS Glassfish Metro

时间:2012-09-12 14:57:23

标签: jax-ws glassfish-3 java-metro-framework

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

我们的测试未发现SOAP和Fast Infoset客户端的往返时间之间存在任何差异。我的消息不包括指示application / fastinfoset的标题信息。从我可以看到Fast Infoset没有开启,因为客户端没有发送正确的信息,因为Metro指南中的技术是错误的或者有一些我完全错过的东西。

我做错了吗?有更好的解决方案吗?

same problem on CXF on this site有一个解决方案,但它不是我可以使用的解决方案,我正在使用Metro。请不要向我提及该解决方案。

以下是关于如何运作的metro guide

  • Glassfish 3.1.2
  • jdk 1.7
  • Metro 2.2

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

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

快速信息集客户端的客户端代码如下所示。 (只需减去上面的行,你就会知道我们的肥皂客户端是什么样的。)上面链接的指南表明上面的行是我们使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();      
     }
}

有一个tutorial from 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已经改变,应该是应用/ fastinfoset根据上面的地铁指南参考。这证明我没有遇到错误,而是存在文档问题。希望我能从这个论坛的专家那里找到答案。

这是我的消息的样子。我砍掉了二进制文件。请注意,服务中没有任何迹象表明与此客户端的持续通信应为Fast Infoset。使用Wireshark我可以明确地说我发送到服务器的消息都没有任何标题信息来指示Fast Infoset。

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没有问题。

1 个答案:

答案 0 :(得分: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