使用httpclient连接池

package com.bltx.sprider.interfaceData;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException;
import java.security.NoSuchAlgorithmException;
import javax.annotation.PostConstruct;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import org.apache.http.HeaderElement;
import org.apache.http.HeaderElementIterator;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.routing.HttpRoute;
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.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeaderElementIterator;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 线程连接池
 * 
 * @author ljw
 *
 */
public class HttpConnectionManager {

	private static Logger log = LoggerFactory.getLogger(HttpConnectionManager.class);

	static PoolingHttpClientConnectionManager cm = null;

	/*
	 * 初始化方法
	 */
	@PostConstruct
	public void init() {
		LayeredConnectionSocketFactory sslsf = null;
		
		try {
			sslsf = new SSLConnectionSocketFactory(SSLContext.getDefault());
		} catch (NoSuchAlgorithmException e) {
			log.error("算法错误");
			e.printStackTrace();
		}
		Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
				.register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build();
		cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
		cm.setMaxTotal(500);// 最大连接数
		cm.setDefaultMaxPerRoute(40);// 将每个路由的默认最大连接数增加到20
		 // 将目标主机的最大连接数增加
		HttpHost localhost = new HttpHost("13.54.120.185",443);
        cm.setMaxPerRoute(new HttpRoute(localhost), 100);
      
        //HttpClientConnectionManager manager = new BasicHttpClientConnectionManager();  
		
		new IdleConnectionMonitorThread(cm).start();//启动线程,5秒钟清空一次失效连接  
	
	}
	
	 

	public static CloseableHttpClient getHttpClient() {
		
		//连接存活策略
		ConnectionKeepAliveStrategy keepAliveStrategy = new ConnectionKeepAliveStrategy() {

	        public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
	            // Honor 'keep-alive' header
	            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")) {
	                    try {
	                        return Long.parseLong(value) * 1000;
	                    } catch(NumberFormatException ignore) {
	                    }
	                }
	            }
	            HttpHost target = (HttpHost) context.getAttribute(
	                    HttpClientContext.HTTP_TARGET_HOST);	            
	            
	            if ("makeabooking.flyscoot.com".equalsIgnoreCase(target.getHostName())) {
	                // Keep alive for 5 seconds only
	                return 5 * 1000;
	            } else {
	                // otherwise keep alive for 30 seconds
	                return 30 * 1000;
	            }
	        }

	    };
	    
        // 请求重试处理
        HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler()
        {
            public boolean retryRequest(IOException exception,
                    int executionCount, HttpContext context) {
                if (executionCount >= 5) {// 如果已经重试了5次,就放弃
                   
                	log.error("已经重试了5次,放弃");
                	
                	return false;
                }
                if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试
                	
                	log.error("服务器丢掉连接");
                	
                	return true;
                }
                if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常
                    
                	log.error("SSL握手异常");
                	
                	return false;
                }
                if (exception instanceof InterruptedIOException) {// 超时
                    
                	log.error("超时");
                	
                	return false;
                }
                if (exception instanceof UnknownHostException) {// 目标服务器不可达
                   
                	log.error("目标服务器不可达");
                	
                	return false;
                }
                if (exception instanceof ConnectTimeoutException) {// 连接被拒绝
                  
                	log.error("连接被拒绝");
                	
                	return false;
                }
                if (exception instanceof SSLException) {// SSL握手异常
                    
                	log.error("SSL异常");
                	
                	return false;
                }

                HttpClientContext clientContext = HttpClientContext
                        .adapt(context);
                HttpRequest request = clientContext.getRequest();
                // 如果请求是幂等的,就再次尝试
                if (!(request instanceof HttpEntityEnclosingRequest)) {
                    return true;
                }
                return false;
            }
        };
		
		// 创建一个httpclient实例
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// 自动处理重定向
		httpClientBuilder.disableAutomaticRetries().setRedirectStrategy(new LaxRedirectStrategy());

		HeadMessage.configureHttpClient(httpClientBuilder);// 忽略证书直接调用

		CloseableHttpClient httpclient = httpClientBuilder
				.setRetryHandler(httpRequestRetryHandler)
				.setConnectionManager(cm)
				.setKeepAliveStrategy(keepAliveStrategy)
				.build(); // 创建一个httpclient实例

		return httpclient;
	}  
}

猜你喜欢

转载自blog.csdn.net/lujunwei0205/article/details/78894263