validationCXF HttpAsyncClient使用use.async.http.conduit上下文属性

我正在尝试使用CXF异步HTTP客户端传输,通过设置“use.async.http.conduit”属性, 如此线程中所详述,并由此CXF文章推荐。

我使用以下代码执行此操作:


Client client = ClientProxy.getClient(wsClient); client.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); 

碰巧,我的Web服务调用超时(可能是由于某些环境网络问题),我的客户端exception包含(提取):


 java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) at java.io.BufferedInputStream.read(BufferedInputStream.java:317) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:698) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:641) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1218) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:260) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1513) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1486) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1305) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:623) 

上面的exception堆栈表明java.net.HttpURLConnection类仍在使用,并且基于CXF文档,该设置尚未生效。

我想弄清楚的是如何确保“use.async.http.conduit”生效,即是否存在可以测试的特定行为,或者我可以在客户端上启用的特定日志配置毫无疑问会告诉我Apache HttpAsyncClient正在使用中吗?

非常感谢 :)

我刚刚找到了我的问题的答案,灵感来自更多阅读CXF文档和一个有用的博客 。

首先,如何确定是使用默认Java传输客户端还是Apache异步传输客户端:

除了我使用的代码(参见问题)

 Client client = ClientProxy.getClient(wsClient); client.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); 

我添加了以下内容:

 HTTPConduit conduit = (HTTPConduit)client.getConduit(); System.out.println(conduit.getClass().getName()); 

这最初产生了

 org.apache.cxf.transport.http.URLConnectionHTTPConduit 

这告诉我设置不起作用。 那时,在阅读了更多的CXF文档之后,我意识到我错过了一个依赖项(我的类路径上的库): cxf-rt-transports-http-hc 。 所以我在我的maven依赖项中添加了库:

  org.apache.cxf cxf-rt-transports-http-hc ${cxf.version}  

然后重试我的代码,输出现在改为:

 org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit 

瞧!