我当前在我的Web服务器中使用Apache HTTP客户端4.5.6支持的RestTemplate
来发出HTTP请求。我的HttpClient
配置如下:
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(httpConfigurationProperties.getConnection().getMaxTotal());
connectionManager.setDefaultMaxPerRoute(httpConfigurationProperties.getConnection()
return HttpClients.custom()
.setDefaultRequestConfig(RequestConfig
.custom()
.setConnectionRequestTimeout((int) httpConfigurationProperties.getTimeout().getConnectionRequestTimeout().toMillis())
.setConnectTimeout((int) httpConfigurationProperties.getTimeout().getConnectTimeout().toMillis())
.setSocketTimeout((int) httpConfigurationProperties.getTimeout().getReadTimeout().toMillis())
.build())
.setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE)
.setConnectionManager(connectionManager)
.build();
当我进行HTTP GET时,偶尔会看到以下内容:
处理时捕获到I / O异常(java.net.SocketException) {s}->请求:连接重置
我在另一篇文章中读到这是由于服务器(我正在向其发送请求)关闭连接而不通知客户端引起的。并且StandardHttpRequestRetryHandler
能够重试。但是不会重试HTTP POST方法,因为它们不是幂等操作。但是是否有一种配置可以避免此连接首先重置?
我尝试使用evictExpiredConnections
并没有帮助。设置connectionManager.setValidateAfterInactivity(20000)
是否有助于在使用前验证连接?
在使用apache http客户端之前,我在SimpleClientHttpRequestFactory
中使用了RestTemplate
,但从未遇到连接重置问题。感谢您的帮助