繁体   English   中英

每隔一个使用 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)在运行。 对于第二个请求,我什至看不到请求传入,因此在我看来,客户端甚至没有尝试。

关于我遗漏/做错了什么的任何想法?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM