Apache HttpClient 4.5:连接重置
Apache HttpClient 4.5: Connection Resets
我正在使用 httpClient 4.5 版连接我们的外部供应商站点。我们不需要任何连接池或持久连接,所以我使用 BasicHttpClientConnectionManager 来创建 HttpClient。
这适用于最少数量的请求,但如果我以 1TPS 的速度测试它 1 小时,到测试结束时,我们开始看到间歇性连接重置。 (猜测请求数 > 100)
I/O 异常 (java.net.SocketException) 在处理对 {s}->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) provided by Oleg
如果是这样,不知道为什么我仍然面临这个问题。有人可以帮忙吗。
谢谢!
嗨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 修复了连接重置错误。
谢谢!
我正在使用 httpClient 4.5 版连接我们的外部供应商站点。我们不需要任何连接池或持久连接,所以我使用 BasicHttpClientConnectionManager 来创建 HttpClient。
这适用于最少数量的请求,但如果我以 1TPS 的速度测试它 1 小时,到测试结束时,我们开始看到间歇性连接重置。 (猜测请求数 > 100)
I/O 异常 (java.net.SocketException) 在处理对 {s}->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) provided by Oleg
如果是这样,不知道为什么我仍然面临这个问题。有人可以帮忙吗。
谢谢!
嗨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 修复了连接重置错误。
谢谢!