2017-08-04 59 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