使用 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 解决了我的问题。
我正在尝试使用 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 解决了我的问题。