public class HttpClientUtils {
private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志记录
//设置连接池
private static PoolingHttpClientConnectionManager pool;
//网络连接重试机制
private static HttpRequestRetryHandler httpRequestRetryHandler;
//配置
private static RequestConfig config;
static {
// 设置从连接池获取连接实例的超时, 设置连接超时,设置读取超时
config = RequestConfig.custom().setConnectionRequestTimeout(3000).setConnectTimeout(5000).setSocketTimeout(10000).build();
ConnectionSocketFactory connectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
LayeredConnectionSocketFactory layeredConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", connectionSocketFactory).register("https", layeredConnectionSocketFactory).build();
pool = new PoolingHttpClientConnectionManager(registry);
// 将最大连接数增加到200
pool.setMaxTotal(200);
// 将每个路由基础的连接增加到20
pool.setDefaultMaxPerRoute(20);
//请求重试处理
httpRequestRetryHandler = new HttpRequestRetryHandler() {
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
if (executionCount >= 5) {// 如果已经重试了5次,就放弃
return false;
}
if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试
return true;
}
if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常
return false;
}
if (exception instanceof InterruptedIOException) {// 超时
return false;
}
if (exception instanceof UnknownHostException) {// 目标服务器不可达
return false;
}
if (exception instanceof ConnectTimeoutException) {// 连接被拒绝
return false;
}
if (exception instanceof SSLException) {// ssl握手异常
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
// 如果请求是幂等的,就再次尝试
if (!(request instanceof HttpEntityEnclosingRequest)) {
return true;
}
return false;
}
};
}
public static CloseableHttpClient getClient() {
return HttpClients.custom().setDefaultRequestConfig(config).setConnectionManager(pool).setRetryHandler(httpRequestRetryHandler).build();
}
}