java - 验证 CXF HttpAsyncClient 对 use.async.http.conduit 上下文属性的使用

标签 java web-services asynchronous cxf httpurlconnection

我正在尝试通过设置“use.async.http.conduit”属性来使用 CXF 异步 HTTP 客户端传输,详见 this thread。 , 并由 this CXF article 推荐.

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


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


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


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)

上面的异常堆栈表明 java.net.HttpURLConnection 类仍在使用中,并且根据 CXF 文档,该设置尚未生效。

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

非常感谢:)

最佳答案

我刚刚找到了我的问题的答案,受到更多阅读 CXF documentation 的启发, 和一个 useful blog .

那么首先如何识别使用的是默认的 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 依赖项中添加了库:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-hc</artifactId>
    <version>${cxf.version}</version>
</dependency>

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

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

瞧!

关于java - 验证 CXF HttpAsyncClient 对 use.async.http.conduit 上下文属性的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24277043/

相关文章:

web-services - 压缩jQuery的Web服务响应

java - 为什么我们不同步 Web 服务?

javascript - 需要 sharepoint Socialdataservice.asmx 的项目 URL 格式

java - 节点数组如何工作?

java - 用java编写一个contains方法

java - 在 JTree 上设置 SUID?

javascript - Mongodb 查找不返回数组

javascript - 尽管已更新,但 React useState 钩子(Hook)仍返回旧状态值

ios - 在 iOS 中重试 HTTP 请求

java - 如何使用纯 Java 动态生成 Java Bean 类?