我正在尝试使用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实例,那么一切正常。 在服务器端,我有一个野生动物8(和9)运行。对于第二个请求,我甚至看不到请求传入,所以对我来说,看起来客户端甚至没有尝试。
关于我遗失/做错的任何想法?
答案 0 :(得分:1)
感谢hotzst提示启用日志记录,我明白了:
服务器正在撤销HTTP状态204(无内容),但无论如何都发送了一些响应数据。 HttpClient将这些响应数据作为NEXT请求的“响应中的垃圾”获得,这通过搞砸响应头来打破它。将reservers响应代码更改为404可以解决我的问题。