使用Apache HTTPClient的每秒请求都会失败

时间:2015-10-01 09:15:26

标签: java apache-httpclient-4.x

我正在尝试使用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)运行。对于第二个请求,我甚至看不到请求传入,所以对我来说,看起来客户端甚至没有尝试。

关于我遗失/做错的任何想法?

1 个答案:

答案 0 :(得分:1)

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

服务器正在撤销HTTP状态204(无内容),但无论如何都发送了一些响应数据。 HttpClient将这些响应数据作为NEXT请求的“响应中的垃圾”获得,这通过搞砸响应头来打破它。将reservers响应代码更改为404可以解决我的问题。