Apache HttpClient 4.5:连接重置

时间:2017-08-04 20:13:57

标签: java https httpclient apache-httpclient-4.x

我正在使用httpClient 4.5版连接我们的外部供应商网站。我们不需要任何连接池或持久连接,因此我使用BasicHttpClientConnectionManager来创建HttpClient。

这适用于最少数量的请求,但如果我测试1TPS 1小时,则在测试结束时,我们开始看到间歇性连接重置。 (猜测请求数> 100)

处理{s}请求时遇到的I / O异常(java.net.SocketException) - > https://apiURL:443:连接重置

请在下面找到用于建立连接的代码段。

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), new X509TrustManager[] { new DefaultTrustManager() }, new SecureRandom());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" }, null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();

HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry);
HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(1, false);

RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(Integer.parseInt(30000)).setConnectTimeout(Integer.parseInt(30000)).setConnectionRequestTimeout(30000).setCookieSpec(CookieSpecs.STANDARD).build();

CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(defaultRequestConfig).setRetryHandler(retryHandler).evictExpiredConnections().build();

HttpPost httpPost = new HttpPost(<endpoint>);
httpPost.setEntity(new UrlEncodedFormEntity(requestData));
httpResponse = httpClient.execute(httpPost);

我看到针对报告的类似问题的修复程序已经在4.5版中提供。 (参考:https://issues.apache.org/jira/browse/HTTPCLIENT-1655)由Oleg

提供

如果是这样,不确定为什么我仍然面临这个问题。有人可以帮忙吗。

谢谢!

1 个答案:

答案 0 :(得分:2)

Oleg

当我仍然看到上面发布的连接重置错误时,我一直在使用httpclient版本4.5.3。

后来注意到重置问题的修复程序已提交到版本4.5.1(https://issues.apache.org/jira/browse/HTTPCLIENT-1655)。所以,只是尝试更新该特定版本,运行测试,而不再看到连接重置错误。 我曾预计此修复程序也应该从4.5.1开始的更高版本中可用。但是,我猜它在某种程度上错过了更高版本,已经证实它仍然是版本4.5.3的问题。

因此,结论是使用httpclient 4.5.1 jar修复了连接重置错误。

谢谢!