http客戶端工具類,用於獲取http客戶端實例(單例)

package com.amarsoft.hub.api.utils;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * http客戶端工具類,用於獲取http客戶端實例(單例)
 */
public class HttpClientUtils {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtils.class);
	
	public static CloseableHttpClient getHttpClient() {
		return HttpClientHolder.httpClient;
	}
	
	public static RequestConfig createRequestConfig(int timeout) {
		RequestConfig requestConfig = RequestConfig.custom()
				.setSocketTimeout(timeout)
				.setConnectionRequestTimeout(timeout)
				.setConnectTimeout(timeout)
				.build();
		return requestConfig;
	} 
	
	private static class HttpClientHolder {
		
		private static final CloseableHttpClient httpClient = createHttpClient();
		
		@SuppressWarnings("resource")
		private static CloseableHttpClient createHttpClient() {
			PoolingHttpClientConnectionManager cm = null;
			SSLContextBuilder builder = new SSLContextBuilder();
			//全部信任 不做身份鑑定
            try {
				builder.loadTrustMaterial(null, new TrustStrategy() {
				    @Override
				    public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
				        return true;
				    }
				});
			} catch (NoSuchAlgorithmException | KeyStoreException e) {
				LOGGER.error("",e);
			}
            
			LayeredConnectionSocketFactory sslsf = null;
			try {
				sslsf = new SSLConnectionSocketFactory(builder.build(),NoopHostnameVerifier.INSTANCE);
			} catch (NoSuchAlgorithmException | KeyManagementException e) {
				LOGGER.error("", e);
			}
			Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
					.register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();
			cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
			cm.setMaxTotal(400);
			cm.setDefaultMaxPerRoute(20);
			
			HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
				@Override
				public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
					return false;
				}
			};

			CloseableHttpClient httpClient = HttpClients.custom()
														.setRetryHandler(retryHandler)
														.setConnectionManager(cm)
														.build();
			
			return httpClient;
		}
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章