使用 Apache HTTPClient 的每个第二个请求都会失败

Every second request using Apache HTTPClient fails

我正在尝试使用 Apache HTTPClient 4.5.1 执行一些休息请求。不幸的是,每个第二个请求都以 "java.net.SocketTimeoutException: Read timed out" 结束(或者如果未设置套接字超时则永远挂起)。

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

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)运行。对于第二个请求,我什至看不到传入的请求,所以对我来说,客户端似乎根本没有尝试。

关于我的任何想法 missing/doing 错了吗?

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

服务器正在返回 HTTP 状态 204(无内容),但仍然发送了一些响应数据。 HttpClient 将这些响应数据作为 NEXT 请求的 "Garbage in response",这通过搞砸响应 headers 来破坏它。将 reservers 响应代码更改为 404 解决了我的问题。