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

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

The newest version!
/*
 * **********************************************************************
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称:common
 * 项目描述:公共的工具集
 * 版权说明:本软件属andy.zhou([email protected])所有。
 * ***********************************************************************
 */
package net.wicp.tams.common.http;

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

import javax.net.ssl.SSLContext;

import org.apache.http.HttpHost;
import org.apache.http.client.CookieStore;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.CookieSpecs;
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.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultRedirectStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import net.wicp.tams.common.Conf;
import net.wicp.tams.common.apiext.StringUtil;
import net.wicp.tams.common.exception.ExceptAll;
import net.wicp.tams.common.exception.ProjectExceptionRuntime;

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;
	// private CookieStore cookieStore;

	/***
	 * 双重检查
	 * 
	 * @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")))
							//.setCookieSpec(CookieSpecs.IGNORE_COOKIES)
							.setStaleConnectionCheckEnabled(true).build();
					tempobj.defaultClient = HttpClients.custom().setDefaultRequestConfig(tempobj.requestConfig)
							.setConnectionManager(tempobj.cm).build();
					// tempobj.cookieStore = new BasicCookieStore();// 支持session保持时会用。
					// 启动回收资源线程,有了它就不需要手动关闭链接。
					new ReleaseConnectionThread(tempobj.cm).start();
					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 newHttpClientSession(CookieStore cookieStore) {
		return newHttpClient(null, true, cookieStore);
	}

	/***
	 * 
	 * 
	 * @param credentialsProvider 认证
	 * @param saveSession         是否启用session保持
	 * @param cookieStore         要保持的cookie
	 * @return
	 */
	public CloseableHttpClient newHttpClient(CredentialsProvider credentialsProvider, boolean saveSession,
			CookieStore cookieStore) {
		HttpClientBuilder httpClientBuilder = HttpClients.custom().setDefaultRequestConfig(this.requestConfig);
		if (credentialsProvider != null) {
			httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
		}
		if (saveSession) {
			if (cookieStore == null) {
				throw new ProjectExceptionRuntime(ExceptAll.param_error, "要保持session时cookieStore不能为空");
			}
			// DefaultRedirectStrategy.INSTANCE 只支持HEAD和GET  LaxRedirectStrategy.INSTANCE也支持post
			httpClientBuilder.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
					.setRedirectStrategy(DefaultRedirectStrategy.INSTANCE) .setDefaultCookieStore(cookieStore);
		} else {
			httpClientBuilder.setDefaultCookieStore(cookieStore).setConnectionManager(this.cm);// 由池管理(保持session时手动关闭,不由池进行关闭)
		}
		CloseableHttpClient httpClient = httpClientBuilder.build();
		return httpClient;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy