• HttpClientPoolUtil


    HttpClientPoolUtil

    标签(空格分隔): Java


    工具类

    import org.apache.http.HeaderElement;
    import org.apache.http.HeaderElementIterator;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.*;
    import org.apache.http.client.protocol.HttpClientContext;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.conn.ConnectionKeepAliveStrategy;
    import org.apache.http.entity.StringEntity;
    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.message.BasicHeaderElementIterator;
    import org.apache.http.protocol.HTTP;
    import org.apache.http.protocol.HttpContext;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.StringUtils;
    import java.io.IOException;
    import java.net.URI;
    import java.nio.charset.StandardCharsets;
    import java.util.Map;
    
    
    /**
     * @program: parent
     * @description: HttpClientPoolUtil
     * @author: zhaobo.zeus
     * @create: 2020-07-09 18:40
     **/
    public class HttpClientPoolUtil {
        private static Logger logger = LoggerFactory.getLogger(HttpClientPoolUtil.class);
        public static PoolingHttpClientConnectionManager cm = null;
        public static CloseableHttpClient httpClient = null;
        /** * 默认content 类型 */
        private static final String DEFAULT_CONTENT_TYPE = "application/json";
        /** * 默认请求超时时间30s */
        private static final int DEFAUL_TTIME_OUT = 15000;
        private static final int count = 32;
        private static final int totalCount = 1000;
        private static final int Http_Default_Keep_Time =15000;
    
        /** * 初始化连接池 */
        public static synchronized void initPools() {
            if (httpClient == null) {
                cm = new PoolingHttpClientConnectionManager();
                cm.setDefaultMaxPerRoute(count);
                cm.setMaxTotal(totalCount);
                httpClient = HttpClients.custom().setKeepAliveStrategy(defaultStrategy).setConnectionManager(cm).build();
            }
        }
    
        /**
         *  Http connection keepAlive 设置
         */
        public static ConnectionKeepAliveStrategy defaultStrategy = new ConnectionKeepAliveStrategy() {
            @Override
            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
                int keepTime = Http_Default_Keep_Time;
                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 (Exception e) {
                            e.printStackTrace();
                            logger.error("format KeepAlive timeout exception, exception:" + e.toString());
                        }
                    }
                }
                return keepTime * 1000;
            }
        };
    
        public static CloseableHttpClient getHttpClient() {
            return httpClient;
        }
    
        public static PoolingHttpClientConnectionManager getHttpConnectionManager() {
            return cm;
        }
    
        /**
         * 执行http post请求
         * 默认采用Content-Type:application/json,Accept:application/json
         * @param uri 请求地址
         * @param data 请求数据
         * @return
         */
        public static String executePost(String uri, String data) {
            long startTime = System.currentTimeMillis();
            HttpEntity httpEntity = null;
            HttpEntityEnclosingRequestBase method = null;
            String responseBody = "";
            try {
                if (httpClient == null) {
                    initPools();
                }
                method = (HttpEntityEnclosingRequestBase) getRequest(uri, HttpPost.METHOD_NAME, DEFAULT_CONTENT_TYPE, 0);
                method.setEntity(new StringEntity(data));
                HttpContext context = HttpClientContext.create();
                CloseableHttpResponse httpResponse = httpClient.execute(method, context);
                httpEntity = httpResponse.getEntity();
                if (httpEntity != null) {
                    responseBody = EntityUtils.toString(httpEntity, "UTF-8");
                }
            } catch (Exception e) {
                if (method != null) {
                    method.abort();
                }
                e.printStackTrace();
                logger.error("execute post request exception, url:" + uri + ", exception:" + e.toString()
                        + ", cost time(ms):" + (System.currentTimeMillis() - startTime));
            } finally {
                if (httpEntity != null) {
                    try {
                        EntityUtils.consumeQuietly(httpEntity);
                    } catch (Exception e) {
                        e.printStackTrace();
                        logger.error("close response exception, url:" + uri + ", exception:" + e.toString()
                                + ", cost time(ms):" + (System.currentTimeMillis() - startTime));
                    }
                }
            }
            return responseBody;
        }
    
    
        public static String doPostJson(String url, String jsonParam, Map<String, String> headers) {
            HttpPost httpPost = null;
            CloseableHttpResponse response = null;
            try {
                if (httpClient == null) {
                    initPools();
                }
                httpPost = new HttpPost(url);
                //addHeader,如果Header没有定义则添加,已定义则不变,setHeader会重新赋值
                httpPost.addHeader("Content-type","application/json;charset=utf-8");
                httpPost.setHeader("Accept", "application/json");
                StringEntity entity = new StringEntity(jsonParam, StandardCharsets.UTF_8);
    //            entity.setContentType("text/json");
    //            entity.setContentEncoding(new BasicHeader("Content-Type", "application/json;charset=UTF-8"));
                httpPost.setEntity(entity);
                //是否有header
                if (headers != null && headers.size() > 0) {
                    for (Map.Entry<String, String> entry : headers.entrySet()) {
                        httpPost.addHeader(entry.getKey(), entry.getValue());
                    }
                }
                // 执行请求
                response = httpClient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
    
            } catch (Exception e) {
                throw new RuntimeException("[send POST request error:]" + e.getMessage());
            } finally {
                try {
                    httpPost.releaseConnection();
                    response.close();
                    if (httpClient != null) {
                        httpClient.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        /**
         * * 创建请求
         * @param uri 请求url
         * @param methodName 请求的方法类型
         * 	@param contentType contentType类型
         *  @param timeout 超时时间
         * @param @return    入参
         * @return HttpRequestBase    返回类型
         * @author lisc
         * @throws
         * @date 2019年7月9日 上午11:37:00
         * @version V1.0
         */
        public static HttpRequestBase getRequest(String uri, String methodName, String contentType, int timeout) {
            if (httpClient == null) {
                initPools();
            }
            HttpRequestBase method = null;
            if (timeout <= 0) {
                timeout = DEFAUL_TTIME_OUT;
            }
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout * 1000)
                    .setConnectTimeout(timeout * 1000).setConnectionRequestTimeout(timeout * 1000)
                    .setExpectContinueEnabled(false).build();
            if (HttpPut.METHOD_NAME.equalsIgnoreCase(methodName)) {
                method = new HttpPut(uri);
            } else if (HttpPost.METHOD_NAME.equalsIgnoreCase(methodName)) {
                method = new HttpPost(uri);
            } else if (HttpGet.METHOD_NAME.equalsIgnoreCase(methodName)) {
                method = new HttpGet(uri);
            } else {
                method = new HttpPost(uri);
            }
            if (StringUtils.isEmpty(contentType)) {
                contentType = DEFAULT_CONTENT_TYPE;
            }
            method.addHeader("Content-Type", contentType);
            method.addHeader("Accept", contentType);
            method.setConfig(requestConfig);
            return method;
        }
    
    
        public static String doGet(String path, Map<String, String> param, Map<String, String> headers) {
            HttpGet httpGet = null;
            CloseableHttpResponse response = null;
           // CloseableHttpClient httpClient = wrapClient(path);
            // 创建uri
            URIBuilder builder = null;
            try {
                builder = new URIBuilder(path);
                if (param != null) {
                    for (String key : param.keySet()) {
                        builder.addParameter(key, param.get(key));
                    }
                }
                URI uri = builder.build();
                // 创建http GET请求
                httpGet = new HttpGet(uri);
                if (headers != null && headers.size() > 0) {
                    for (Map.Entry<String, String> entry : headers.entrySet()) {
                        httpGet.addHeader(entry.getKey(), entry.getValue());
                    }
                }
    
                // 执行请求
                response = httpClient.execute(httpGet);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            } catch (Exception e) {
                throw new RuntimeException("[send Get request error:]" + e.getMessage());
            } finally {
                try {
                    httpGet.releaseConnection();
                    response.close();
                    if (httpClient != null) {
                        httpClient.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
        /**
         * 执行GET 请求
         *  @param uri
         *  @return
         */
        public static String executeGet(String uri) {
            long startTime = System.currentTimeMillis();
            HttpEntity httpEntity = null;
            HttpRequestBase method = null;
            String responseBody = "";
            try {
                if (httpClient == null) {
                    initPools();
                }
                method = getRequest(uri, HttpGet.METHOD_NAME, DEFAULT_CONTENT_TYPE, 0);
                HttpContext context = HttpClientContext.create();
                CloseableHttpResponse httpResponse = httpClient.execute(method, context);
                httpEntity = httpResponse.getEntity();
                if (httpEntity != null) {
                    responseBody = EntityUtils.toString(httpEntity, "UTF-8");
                    logger.info("request URL: " + uri + " + Return status code:" + httpResponse.getStatusLine().getStatusCode());
                }
            } catch (Exception e) {
                if (method != null) {
                    method.abort();
                }
                e.printStackTrace();
                logger.error("execute get request exception, url:" + uri + ", exception:" + e.toString() + ",cost time(ms):"
                        + (System.currentTimeMillis() - startTime));
            } finally {
                if (httpEntity != null) {
                    try {
                        EntityUtils.consumeQuietly(httpEntity);
                    } catch (Exception e) {
                        e.printStackTrace();
                        logger.error("close response exception, url:" + uri + ", exception:" + e.toString()
                                + ",cost time(ms):" + (System.currentTimeMillis() - startTime));
                    }
                }
            }
            return responseBody;
        }
    
    
        public static void main(String[] args) {
    
                System.out.println("接口请求结果 ");
    
    
    
        }
    
    }
    
    
  • 相关阅读:
    菜鸟调错(四)——Spring与DWR集成,配置文件报错
    FIFO、LRU、OPT页面调度算法及样例
    JConsole的使用手册 JDK1.5(转)
    jconsole JDK1.6 使用手册 (转)
    CPU利用率与Load Average的区别?
    Load和CPU利用率是如何算出来的 (转发)
    SecureCRT 默认配置
    Java 内存区域和GC机制(转载)
    Java 线程池的原理与实现 (转)
    【转载】java项目中经常碰到的内存溢出问题: java.lang.OutOfMemoryError: PermGen space, 堆内存和非堆内存,写的很好,理解很方便
  • 原文地址:https://www.cnblogs.com/hit-zb/p/13382781.html
Copyright © 2020-2023  润新知