【发布时间】:2015-10-01 09:15:25
【问题描述】:
我正在尝试使用 Apache HTTPClient 4.5.1 来执行一些休息请求。不幸的是,每秒请求都会以“java.net.SocketTimeoutException:读取超时”结束(如果未设置套接字超时,则会永远挂起)。
我正在这样构建我的客户端:
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 个)正在运行。对于第二个请求,我什至看不到请求传入,所以在我看来,客户端甚至没有尝试。
关于我错过什么/做错了什么有什么想法吗?
【问题讨论】:
-
第二行的
sf指的是什么?如果增加超时时间会有所不同吗?启用日志记录 (stackoverflow.com/questions/3246792/…) 后会得到什么?对同一服务器的其他请求是否有效?服务器是否支持 DELETE? -
问题可能是中间的某个网络组件,是否涉及负载均衡器?
标签: java apache-httpclient-4.x