此问题排查方向为连接本身的问题
比如:客户端使用连接池技术访问服务端,连接池默认情况下使用了长连接来避免每次建立连接消耗,从而提升性能,但是服务端设置了keepalive timeout ,服务端在规定时间内会进行连接清理,当超过了timeout的时间,连接不在了,但是客户端不知道,在去连接时就会报错;
使用PoolingHttpClientConnectionManager – > CloseableHttpClient 技术的解决方案:
CloseableHttpClient httpClient = HttpClients.custom()
//主要是这一行代码,用来维持连接一直存在
.setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
// 设置连接池管理
.setConnectionManager(pool)
// 设置请求配置
.setDefaultRequestConfig(requestConfig)
// 设置重试次数
.setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)).build();
//用来设置keepalive的时间
class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
return 50;
}
}
问题解决