接上一篇Http连接池的应用
2020-07-12 16:55
309 查看
改动后的代码, 支持多个url长连接
import org.apache.http.*; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; 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.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.entity.ByteArrayEntity; 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.util.EntityUtils; import javax.net.ssl.SSLException; import javax.net.ssl.SSLHandshakeException; import java.io.IOException; import java.io.InterruptedIOException; import java.net.UnknownHostException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class HttpClientUtil { private static ConcurrentMap<String, CloseableHttpClient> records = new ConcurrentHashMap<>(); public static String post(String biz, String url, String data, Map<String, String> headerMap) throws IOException { HttpPost httppost = new HttpPost(url); config(httppost); if (headerMap != null) { for(Map.Entry<String, String> entry : headerMap.entrySet()){ httppost.setHeader(entry.getKey(), entry.getValue()); } } if (null != data && !"".equals(data)) { httppost.setEntity(new ByteArrayEntity(data.getBytes("utf-8"))); } CloseableHttpResponse response = null; try { response = getHttpClientGo(url, biz).execute(httppost, HttpClientContext.create()); return EntityUtils.toString(response.getEntity(), "utf-8"); } finally { try { if (response != null) response.close(); } catch (IOException e) { e.printStackTrace(); } } } private static void config(HttpRequestBase httpRequestBase) { RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(15000) .setConnectTimeout(15000).setSocketTimeout(15000).build(); httpRequestBase.setConfig(requestConfig); } private static CloseableHttpClient getHttpClientGo(String url, String biz) { CloseableHttpClient rec = records.get(biz); if (rec == null) { synchronized (HttpClientUtil.class) { rec = records.get(biz); if (rec == null) { String hostname = url.split("/")[2]; int port = 80; if (hostname.contains(":")) { String[] arr = hostname.split(":"); hostname = arr[0]; port = Integer.parseInt(arr[1]); } CloseableHttpClient temp = createHttpClient(1000, 50, 200, hostname, port); rec = records.putIfAbsent(biz, temp); if (rec == null) { rec = temp; } } } } return rec; } private static CloseableHttpClient createHttpClient(int maxTotal, int maxPerRoute, int maxRoute, String hostname, int port) { ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory(); LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory(); Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create().register("http", plainsf).register("https", sslsf).build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry); cm.setMaxTotal(maxTotal);// 将最大连接数增加 cm.setDefaultMaxPerRoute(maxPerRoute);// 将每个路由基础的连接增加 HttpHost httpHost = new HttpHost(hostname, port); cm.setMaxPerRoute(new HttpRoute(httpHost), maxRoute);// 将目标主机的最大连接数增加 HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> {// 请求重试处理 if (executionCount >= 5) {// 如果已经重试了5次,就放弃 return false; } if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试 return true; } if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常 return false; } if (exception instanceof InterruptedIOException) {// 超时 return false; } if (exception instanceof UnknownHostException) {// 目标服务器不可达 return false; } if (exception instanceof ConnectTimeoutException) {// 连接被拒绝 return false; } if (exception instanceof SSLException) {// SSL握手异常 return false; } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); return !(request instanceof HttpEntityEnclosingRequest);// 如果请求是幂等的,就再次尝试 }; return HttpClients.custom().setConnectionManager(cm).setRetryHandler(httpRequestRetryHandler).build(); } }
相关文章推荐
- 一篇搞懂TCP、HTTP、Socket、Socket连接池
- Python - 体验urllib3 -- HTTP连接池的应用
- HttpClient异步,及连接池应用
- 接上一篇,sort中comp的应用
- 一篇搞懂TCP、HTTP、Socket、Socket连接池
- httpclient连接池在ES Restful API请求中的应用
- 网站安全通用防护代码在ASP.NET MVC 中的应用实例(接上一篇)
- (接上一篇)二叉树的基本应用举例
- Oracle 触发器~~~接上一篇
- HttpServletResponse的应用
- HttpModule 与虚拟目录、子目录 以及应用级别目录
- JAVA发送HTTP请求,返回HTTP响应内容,实例及应用
- Linux C 网络应用总结-- HTTP传输文件
- httpclient http连接池
- Tomcat 的数据库连接池设置与应用
- 只看这一篇就够:快速了解联邦学习技术及应用实践
- Android 网络应用重点———使用HttpURLConnection 上传文件
- 第二十二期 Linux安装/删除应用及快速部署http服务、FTP服务
- ajax应用中的xmlHttpRequest-属性和方法
- 实时视频应用之QoS关键技术分析 转自:http://www.aiweibang.com/m/detail/104476372.html?from=p 随着WebRTC标准的逐步推广,实