Java 在间隔一段时间后调用API时首次获取连接重置异常
我们正在对一个API进行post调用,当我们在一段时间间隔后开始调用这个API时(在我们的例子中,大多数时间是10分钟,如果间隔是5分钟,我们很少得到),我们在第一次尝试时得到连接重置异常,然后其余的立即调用工作正常,但是,如果调用这个API时有10分钟的间隔,然后再次调用,那么在该间隔之后的第一次调用中就会出现这样的异常。 我们使用JavaSpringBootRestTamplate进行API调用,并使用ApacheHttpClient-4.5.2 apache日志Java 在间隔一段时间后调用API时首次获取连接重置异常,java,spring,spring-boot,http,connection-pooling,Java,Spring,Spring Boot,Http,Connection Pooling,我们正在对一个API进行post调用,当我们在一段时间间隔后开始调用这个API时(在我们的例子中,大多数时间是10分钟,如果间隔是5分钟,我们很少得到),我们在第一次尝试时得到连接重置异常,然后其余的立即调用工作正常,但是,如果调用这个API时有10分钟的间隔,然后再次调用,那么在该间隔之后的第一次调用中就会出现这样的异常。 我们使用JavaSpringBootRestTamplate进行API调用,并使用ApacheHttpClient-4.5.2 apache日志 “[读取]I/O错误:读取
“[读取]I/O错误:读取超时”
Java日志
连接重置;嵌套异常为java.net.SocketException:连接重置
Resttamplate配置
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
return restTemplate;
}
@Bean
public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setHttpClient(httpClient());
return clientHttpRequestFactory;
}
@Bean
public CloseableHttpClient httpClient() {
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(180000)
.setConnectTimeout(180000)
.setSocketTimeout(180000).build();
return HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(poolingConnectionManager())
// .setKeepAliveStrategy(connectionKeepAliveStrategy())
.build();
}
@Bean
public PoolingHttpClientConnectionManager poolingConnectionManager() {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
poolingConnectionManager.setMaxTotal(50);
return poolingConnectionManager;
}
如果我们像下面提到的那样在HttpClients.custom()中添加set-connectionKeepAliveStrategy,我们将不会得到任何这样的异常
@Bean
public ConnectionKeepAliveStrategy connectionKeepAliveStrategy() {
return new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
HeaderElementIterator it = new BasicHeaderElementIterator
(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
while (it.hasNext()) {
HeaderElement he = it.nextElement();
String param = he.getName();
String value = he.getValue();
if (value != null && param.equalsIgnoreCase("timeout")) {
return Long.parseLong(value) * 1000;
}
}
return 20000;
}
};
}
不知道为什么这种例外情况会随着ConnectionKeepAlivestStrategy而消失。它在这方面的作用是什么?。
提前感谢。检查中的两个要点:第2.6节-连接保持策略
保持活动状态
响应中的标题保持活动头。
保持活动状态
策略:连接池的初始大小是多少请尝试按照使用HttpClient-4.5.1,看看它是否解决了您的问题。@jumping\u monkey我们在版本4.5.7中也遇到了同样的问题,它在这个版本中也没有修复吗?@CodeRider max total是50,不确定您所说的初始大小是什么意思。@jumping\u monkey我刚刚用4.5.1尝试过,还没修好。