【问题标题】:Every second request using Apache HTTPClient fails使用 Apache HTTPClient 的每秒请求都会失败
【发布时间】:2015-10-01 09:15:25
【问题描述】:

我正在尝试使用 Apache HTTPClient 4.5.1 来执行一些休息请求。不幸的是,每秒请求都会以“java.net.SocketTimeoutException:读取超时”结束(如果未设置套接字超时,则会永远挂起)。

我正在这样构建我的客户端:

ConnectionSocketFactory sf = new PlainConnectionSocketFactory();

Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create()
    .register("http", sf)
    .build();

Lookup<AuthSchemeProvider> authProviders = RegistryBuilder.<AuthSchemeProvider> create()
    .register(AuthSchemes.BASIC, (AuthSchemeProvider) new BasicSchemeFactory())
    .build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);

CredentialsProvider cp = new BasicCredentialsProvider();
cp.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));

RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(15000)
    .setConnectionRequestTimeout(15000)
    .setSocketTimeout(15000)
    .build();

this.client = HttpClients.custom()
    .setConnectionManager(cm)
    .setDefaultCredentialsProvider(cp)
    .setDefaultAuthSchemeRegistry(authProviders)
    .setDefaultRequestConfig(requestConfig)
    .build();

之后我像这样(在同一个 HttpClient 实例上)执行我的请求:

HttpDelete delete = new HttpDelete(uri);

HttpClientContext context = HttpClientContext.create();
CloseableHttpResponse response = this.client.execute(request, context);
try {
    int statusCode = response.getStatusLine().getStatusCode();
    return statusCode;
}
finally {
    response.close();
}

如果我开始为每个请求使用一个新的 HttpClient 实例,一切都会正常工作。 在服务器端,我有一个 Wildfly 8(还有 9 个)正在运行。对于第二个请求,我什至看不到请求传入,所以在我看来,客户端甚至没有尝试。

关于我错过什么/做错了什么有什么想法吗?

【问题讨论】:

  • 第二行的sf 指的是什么?如果增加超时时间会有所不同吗?启用日志记录 (stackoverflow.com/questions/3246792/…) 后会得到什么?对同一服务器的其他请求是否有效?服务器是否支持 DELETE?
  • 问题可能是中间的某个网络组件,是否涉及负载均衡器?

标签: java apache-httpclient-4.x


【解决方案1】:

感谢hotzst 的提示启用日志记录,我想通了:

服务器正在返回 HTTP 状态 204(无内容),但还是发送了一些响应数据。 HttpClient 将这些响应数据作为 NEXT 请求的“响应中的垃圾”获取,这通过弄乱响应标头来破坏它。将保留者响应代码更改为 404 可以解决我的问题。

【讨论】:

  • 它是“我的”服务器,所以我修复了那端的软件。
猜你喜欢
  • 2017-08-02
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
相关资源
最近更新 更多