我们正在构建一个高吞吐量的后端系统,它将发送和检索可变大小的 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 没有问题。