初始化连接池,并设置重试机制,超时时间,资源释放优化
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpClientUtils {
private static Logger log = LoggerFactory.getLogger(HttpClientUtils.class);
private static PoolingHttpClientConnectionManager manager = null;
private static CloseableHttpClient httpClient = null;
public static synchronized CloseableHttpClient getHttpClient() {
if (httpClient == null) {
log.info("---------------------------------------------------------创建连接");
configHttpClientConnectionManager();
httpClient = InitCloseableHttpClient();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
if (httpClient != null) {
httpClient.close();
}
} catch (IOException e) {
log.error("error when close httpClient:{}", e);
}
}
});
}
return httpClient;
}
private static void configHttpClientConnectionManager() {
Registry<ConnectionSocketFactory> socketFactoryRegistry = getRegistry();
DnsResolver dnsResolver = SystemDefaultDnsResolver.INSTANCE;
manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, getHttpConnectionFactory(), dnsResolver);
SocketConfig defaultSocketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
manager.setDefaultSocketConfig(defaultSocketConfig);
manager.setMaxTotal(300);
manager.setDefaultMaxPerRoute(200);
manager.setValidateAfterInactivity(5 * 1000);
}
private static HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> getHttpConnectionFactory(){
return new ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE, DefaultHttpResponseParserFactory.INSTANCE);
}
private static CloseableHttpClient InitCloseableHttpClient() {
return HttpClients.custom()
.setConnectionManager(manager)
.setConnectionManagerShared(false)
.evictIdleConnections(60, TimeUnit.SECONDS)
.evictExpiredConnections()
.setConnectionTimeToLive(60, TimeUnit.SECONDS)
.setDefaultRequestConfig(getRequestConfig())
.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
.setRetryHandler(new DefaultHttpRequestRetryHandler(3, false))
.build();
}
private static RequestConfig getRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(2 * 1000)
.setSocketTimeout(5 * 1000)
.setConnectionRequestTimeout(2000)
.build();
}
private static Registry<ConnectionSocketFactory> getRegistry(){
return RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", SSLConnectionSocketFactory.getSystemSocketFactory()).build();
}
}