2017-08-04 93 views
3

我正在使用httpClient版本4.5来连接我们的外部供应商站点。我们不需要任何连接池或持久连接,所以我使用BasicHttpClientConnectionManager创建HttpClient。Apache HttpClient 4.5:连接重置

这对最小数量的请求工作正常,但如果我测试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。 (Ref:https://issues.apache.org/jira/browse/HTTPCLIENT-1655)由Oleg提供

如果是这样的话,不知道为什么我仍然面临这个问题。有人可以帮助解决这个问题。

谢谢!

+0

您是否考虑过对端点重置连接的可能性? – oleg

+0

感谢您的回复,[Oleg](https://stackoverflow.com/users/335638/oleg)。从我们在这里与网络团队一起运行的跟踪中,可以看到当Destination主机向我们请求ACK时,我们的服务器Source已经发送了很多重置(RST)。所以,这就是我试图弄清楚它是否与我们使用的HttpClient有关的问题。 – user1347244

+0

在这一点上,我们所做的就是将重试次数增加到3次(使用DefaultHttpRequestRetryHandler),因为我们注意到,在重试后成功处理了一些由连接重置错误命中的请求。但是,这似乎并不适合我们面临的问题。 – user1347244

回答

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修复了连接重置错误。

谢谢!

+0

我的资金有点难以置信,但是如此。 – oleg

+0

是的,我也没有考虑过这种可能性。而且,如果我没有尝试使用不同版本运行多轮测试,我不会那么肯定。这只是一个试验,但我很高兴修复它。希望你会将修补程序添加到更高版本中。 – user1347244

+0

问题是我不知道要修复什么,因为HTTPCLIENT-1655在4.5.1以后的所有4.5.x版本中都存在。我做了仔细检查。 – oleg