All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.wicp.tams.common.http.HttpConnPool Maven / Gradle / Ivy

There is a newer version: 6.1.0
Show newest version
package net.wicp.tams.common.http;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;

import net.wicp.tams.commons.Conf;
import net.wicp.tams.commons.apiext.StringUtil;

import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

public class HttpConnPool {
	private static Object lockobj = new Object();
	private static volatile HttpConnPool INSTANCE;
	private PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
	private RequestConfig requestConfig;
	private CloseableHttpClient defaultClient;
	static{
		Conf.addFileFromJar("common-http.properties", HttpConnPool.class);
	}

	/***
	 * 双重检查
	 * 
	 * @return
	 */
	public static final HttpConnPool getInstance() {
		if (INSTANCE == null) {
			synchronized (lockobj) {
				if (INSTANCE == null) {
					HttpConnPool tempobj = new HttpConnPool();
					tempobj.cm = new PoolingHttpClientConnectionManager();
					// 将最大连接数增加到200
					tempobj.cm.setMaxTotal(
							Integer.parseInt(StringUtil.hasNull(Conf.get("common.http.connpool.maxtotal"), "200")));
					// 将每个路由基础的连接增加到20
					tempobj.cm.setDefaultMaxPerRoute(
							Integer.parseInt(StringUtil.hasNull(Conf.get("common.http.connpool.maxperroute"), "20")));
					// 默认client端
					tempobj.requestConfig = RequestConfig.custom()
							.setSocketTimeout(Integer.parseInt(
									StringUtil.hasNull(Conf.get("common.http.connpool.defaultconn.sockettimeout"), "5000")))
							.setConnectTimeout(Integer.parseInt(
									StringUtil.hasNull(Conf.get("common.http.connpool.defaultconn.connecttimeout"), "5000")))
							.setConnectionRequestTimeout(Integer.parseInt(
									StringUtil.hasNull(Conf.get("common.http.connpool.defaultconn.requesttimeout"), "5000")))
							.setStaleConnectionCheckEnabled(true).build();
					tempobj.defaultClient = HttpClients.custom().setDefaultRequestConfig(tempobj.requestConfig)
							.setConnectionManager(tempobj.cm).build();
					INSTANCE = tempobj;
				}
			}
		}
		return INSTANCE;
	}
	
	
	public CloseableHttpClient newSSLClient(TrustStrategy trustStrategy){
		if(trustStrategy==null){
			trustStrategy=new TrustStrategy() {
	            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {//信任所有
	                return true;
	            }
	        };
		}
		SSLContext sslContext;
		try {
			sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(null,trustStrategy).build();
		} catch (Exception e) {
			throw new IllegalArgumentException("创建  SSLContext异常");
		} 
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
		HttpClientBuilder build= HttpClients.custom().setDefaultRequestConfig(requestConfig).setSSLSocketFactory(sslsf);
		return build.build();
	}
	
	public CloseableHttpClient newSSLClient(){
		return newSSLClient(null);
	}
	

	/***
	 * 设置目录机的最大连接数
	 * 
	 * @param host
	 * @param port
	 * @param maxnum
	 */
	public void setMaxPerRoute(String host, int port, int maxnum) {
		HttpHost localhost = new HttpHost(host, port);
		cm.setMaxPerRoute(new HttpRoute(localhost), maxnum);
	}

	/***
	 * 得到默认的客户端,不需要关闭
	 * 
	 * @return
	 */
	public CloseableHttpClient getClient() {
		if (defaultClient == null) {
			RequestConfig reqconfig = RequestConfig.custom().setSocketTimeout(5000)
					.setConnectTimeout(Integer.parseInt(Conf.get("common.http.connpool.defaultconn.connecttimeout")))
					.setConnectionRequestTimeout(Integer.parseInt(Conf.get("common.http.connpool.defaultconn.requesttimeout")))
					.setStaleConnectionCheckEnabled(true).build();
			defaultClient = HttpClients.custom().setDefaultRequestConfig(reqconfig).setConnectionManager(cm).build();
		}
		return defaultClient;
	}

	/***
	 * 得到新的客户端,需要客户自行关闭
	 * 
	 * @return
	 */
	public CloseableHttpClient newHttpClient() {
		RequestConfig reqconfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000)
				.setConnectionRequestTimeout(5000).setStaleConnectionCheckEnabled(true).build();
		CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(reqconfig)
				.setConnectionManager(cm).build();
		return httpClient;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy