http连接池的配置

import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.client.config.CookieSpecs;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

/**
 * http连接池管控
 */
public class HttpClientPool {
    
    private static volatile CloseableHttpClient client = null;
    private static PoolingHttpClientConnectionManager cm = null;
    private static RequestConfig config = null;
    
    //---------------配置连接属性--------------------------
    private static int requestTimeOut = 120000; //从池中获取请求的时间
    private static int connectTimeout = 120000;  //连接到服务器的时间
    private static int socketTimeout = 120000; //读取信息时间
    //---------------配置连接池属性--------------------------
    private static int maxTotal = 400;  //最大连接数
    private static int defaultMaxPerRoute = 200; //单个地址默认连接数量不超过最大连接数据
    //-----------------------------------------------------


    static {
        config = RequestConfig.custom()
                .setConnectionRequestTimeout(requestTimeOut)  
                .setConnectTimeout(connectTimeout) 
                .setSocketTimeout(socketTimeout).build(); 
        
        cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(maxTotal);
        cm.setDefaultMaxPerRoute(defaultMaxPerRoute);
        
        RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
        client = HttpClients.custom()
                .setRetryHandler(DefaultHttpRequestRetryHandler.INSTANCE)
                .setDefaultRequestConfig(config)
                .setConnectionManager(cm)
                .setDefaultRequestConfig(globalConfig)
                .build();
    }

    public static CloseableHttpClient getHttpClient() {
        if (null == client) {
            synchronized (AmarHttpClientPool.class) {
                if (null == client){
                    RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
                    client = HttpClients.custom()
                            .setRetryHandler(DefaultHttpRequestRetryHandler.INSTANCE)
                            .setDefaultRequestConfig(config)
                            .setConnectionManager(cm)
                            .setDefaultRequestConfig(globalConfig)
                            .build();
                }
            }
        }
        return client;
    }    @SuppressWarnings("unused")
    public static String execute() throws Exception {
        String url = "http://...";
        CloseableHttpClient httpClient = HttpClients.createDefault();//HttpClientPool.getHttpClient();
        HttpPost httpPost = new HttpPost(url);
        RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(3000).setConnectionRequestTimeout(5000).build();
        httpPost.setConfig(config);
        httpPost.setEntity(new StringEntity("请求参数....","utf-8"));
        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
            int status = response.getStatusLine().getStatusCode();
            if (status != HttpStatus.SC_OK) {
                throw new Exception("调用服务:"+url+"失败,返回状态码为:"+status);
            }
            String result = EntityUtils.toString(response.getEntity());
            System.out.println("原始报文:"+result);
            String startStr = "<ns1:out>";
            int startIndex = result.indexOf(startStr);
            int endIndex = result.indexOf("</ns1:out>");
            assert startIndex >=0 && endIndex >= 0 : "报文体标志位<ns1:out>或</ns1:out>不存在,原始报文:"+result;
            EntityUtils.consume(response.getEntity());
            return result.substring(startIndex + startStr.length(), endIndex);
        }
    }
    
    /**
     * 调用案例
     */
    public static void main(String[] args) {

        CloseableHttpClient httpclient = HttpClientPool.getHttpClient();

            HttpPost httpPost = new HttpPost("url");
            httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("X-Forwarded-For","ip");
            httpPost.setEntity(new StringEntity(requestParams.toString(), "UTF-8"));

try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
                int status = response.getStatusLine().getStatusCode();
                if (status != HttpStatus.SC_OK) {
                    throw new Exception("调用服务:" + hubserviceUrl + "失败,返回状态码为:" + status);
                }
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    resp = EntityUtils.toString(entity, "UTF-8");
                }
                EntityUtils.consume(response.getEntity());
            }
    }
}

猜你喜欢

转载自blog.csdn.net/John_Kry/article/details/87776785