
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