1. 程式人生 > >httpClient 4.5.2 實現連線池

httpClient 4.5.2 實現連線池

如下程式碼
public class PoolHttpsClientService {


    // 日誌
    private static final SimpleLogger LOGGER = SimpleLogger.getLogger(PoolHttpsClientService.class);


    private static final String CHAR_SET = "UTF-8";


    // 代理IP
    @Value("${InetAddressStr}")
    private String InetAddressStr;


    // 代理埠
    @Value("${InetPort}")
    private int InetPort;


    /**
     * 最大連線數400
     */
    private static int MAX_CONNECTION_NUM = 400;


    /**
     * 單路由最大連線數80
     */
    private static int MAX_PER_ROUTE = 80;


    /**
     * 向服務端請求超時時間設定(單位:毫秒)
     */
    private static int SERVER_REQUEST_TIME_OUT = 2000;


    /**
     * 服務端響應超時時間設定(單位:毫秒)
     */
    private static int SERVER_RESPONSE_TIME_OUT = 2000;


    /**
     * 建構函式
     */
    private PoolHttpsClientService() {
    }


    private static Object LOCAL_LOCK = new Object();
    
    /**
     * 連線池管理物件
     */
    PoolingHttpClientConnectionManager cm = null;


    /**
     * 
     * 功能描述: <br>
     * 初始化連線池管理物件
     *
     * @see [相關類/方法](可選)
     * @since [產品/模組版本](可選)
     */
    private PoolingHttpClientConnectionManager getPoolManager() {
        final String methodName = "getPoolManager";
        LOGGER.enter(methodName, "initPoolManager");
        if (null == cm) {
            synchronized (LOCAL_LOCK) {
                if (null == cm) {
                    SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
                    try {
                        sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
                        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
                                sslContextBuilder.build());
                        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                                .register("https", socketFactory)
                                .register("http", new PlainConnectionSocketFactory())
                                .build();
                        cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
                        cm.setMaxTotal(MAX_CONNECTION_NUM);
                        cm.setDefaultMaxPerRoute(MAX_PER_ROUTE);
                    } catch (Exception e) {
                        LOGGER.error(methodName, "init PoolingHttpClientConnectionManager Error" + e);
                    }


                }
            }
        }
        LOGGER.exit(methodName, "initPoolManager");
        return cm;
    }


    /**
     * 建立執行緒安全的HttpClient
     * 
     * @param config 客戶端超時設定
     * 
     * @return
     */
    public CloseableHttpClient getHttpsClient(RequestConfig config) {
        final String methodName = "getHttpsClient";
        LOGGER.enter(methodName, "initHttpsClient");
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(config)
                .setConnectionManager(this.getPoolManager())
                .build();
        LOGGER.exit(methodName, "initHttpsClient");
        return httpClient;
    }


    /**
     * Https post請求
     * 
     * @param url 請求地址
     * @param json 請求引數(如果為null,則表示不請求引數) return 返回結果
     */
    public String poolHttpsPost(String url, JSONObject json) {
        final String methodName = "poolHttpsPost";
        LOGGER.enter(methodName, json);
        CloseableHttpResponse response = null;
            HttpPost post = null;
        try {
            // 設定代理
            HttpHost proxy = new HttpHost(InetAddressStr, InetPort);
            // connectTimeout設定伺服器請求超時時間
            // socketTimeout設定伺服器響應超時時間
            RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy)
                    .setSocketTimeout(SERVER_REQUEST_TIME_OUT).setConnectTimeout(SERVER_RESPONSE_TIME_OUT).build();
            post = new HttpPost(url);
            post.setConfig(requestConfig);


            if (json != null) {
                StringEntity se = new StringEntity(json.toString(), CHAR_SET);
                se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json;"));
                post.setEntity(se);
            }


            LOGGER.info(methodName, "start post to weixin");
            response = getHttpsClient(requestConfig).execute(post);
            LOGGER.info(methodName, "end post to weixin");
            int status = response.getStatusLine().getStatusCode();
            LOGGER.info(methodName, "return status:" + status);


            String result = null;
            if (status == 200) {
                result = EntityUtils.toString(response.getEntity(), CHAR_SET);
            }
            EntityUtils.consume(response.getEntity());
            response.close();
            LOGGER.exit(methodName);
            return result;
        } catch (Exception e) {
            if (e instanceof SocketTimeoutException) {
                // 伺服器請求超時
                LOGGER.error(methodName, "server request time out");
            } else if (e instanceof ConnectTimeoutException) {
                // 伺服器響應超時(已經請求了)
                LOGGER.error(methodName, "server response time out");
            }
            LOGGER.error(methodName, e.getMessage());
        } finally {
                  post.releaseConnection();
            if (response != null) {
                try {
                    EntityUtils.consume(response.getEntity());
                    response.close();
                } catch (IOException e) {
                    LOGGER.error(methodName, e.getMessage());
                }
            }
        }
        LOGGER.exit(methodName);
        // 超時或者網路不通時返回值
        return null;
    }


相關推薦

httpClient 4.5.2 實現連線

如下程式碼public class PoolHttpsClientService {     // 日誌     private static final SimpleLogger LOGGER = SimpleLogger.getLogger(PoolHttpsCli

HttpClient 4.5.2版本設定連線超時時間-CloseableHttpClient設定Timeout

HttpClient  4.5版本設定連線超時時間-CloseableHttpClient設定Timeout(區別於4.3.2) HttpClient升級到4.5版本後,API有很多變化,HttpClient 4之後,API一直沒有太穩定,我感覺4.5版本抽象後,很多

Atitit 類庫衝突解決方案  httpclient-4.5.2.jar

個人說明 提供相關技術諮詢,以及解決方案編制,編制相關標準化規範草案,軟體培訓與技術點體系建設,知識圖譜體系化,提供軟體行業顧問佈道,12年的軟體行業背景,歡迎有志於軟體行業的同仁們互相交流,群名稱:標準化規範工作組草案,群   號:518818717, 聯絡方式: [

基於HttpClient4.5.2實現HttpClient工具類

1.maven依賴: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</arti

Microsoft .NET Framework 4.5.2 (Offline Installer)

com 2012 r2 install installer frame load ram .aspx exe Microsoft .NET Framework 4.5.2 (Offline Installer) for Windows Vista SP2, Windows

在Eclipse mars 4.5.2 中安裝spring 插件 spring tool suite

dea ins 菜單 eclips .com ips 比較 eclipse http 最近在學習spring,用到的IDE 有eclipse,也有用到 IDEA。 目前對spring還不是很了解,跟著網上的視頻來,先學會了spring,然後再選IDE。 題歸正轉,下面說說怎

FFmpeg 4.0.2 實現兩個YUV序列拼接成一個YUV序列

一、C++程式碼: /* * 兩個YUV拼接成一個YUV * FFmpeg:4.0.2 */ int YUVCombine(AVFrame *srcFrame1, AVFrame *srcFrame2, AVFrame *dstFrame, int dstWidth, int ds

FFmpeg 4.0.2 實現YUV視訊幀scale大小變換

int YUVFrameScale(AVFrame *srcYUVFrame, int nSrcW, int nSrcH, AVFrame *dstYUVFrame, int nDstW, int nDstH) { // 目標緩衝區 int dst_bufferSize =

FFmpeg 4.0.2 實現YUV檔案scale大小變換

/* * 功能:實現YUV檔案scale大小變換 * FFmpeg:4.0.2 */ #include <iostream> extern "C" { #include <libswscale/swscale.h> #include <libavutil/f

Java微型瀏覽器——HttpClient 4.5.6簡要學習總結

原料: MAVEN匯入 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <

HTTPClient 4.5 呼叫https協議的介面

package com.ysmall.util; import org.apache.commons.collections.MapUtils; import org.apache.http.*; import org.apache.http.client.entity.UrlEncoded

易學筆記-Go語言-第4章:基本結構和基本資料型別/4.5 基本型別/4.5.2 整形

 整形 固定位元組數整形:與作業系統無關 int 和 uint 在 32 位作業系統上,它們均使用 32 位(4 個位元組),在 64 位作業系統上,它們均使用 64 位(8 個位元組)。 uintptr 存放指標 指定位元組

易學筆記-系統分析師考試-第4章 資料通訊和計算機網路/4.5 網路工程/4.5.2 網路設計

網路設計 設計順序:確定網路總體目標和設計原則、設計網路的邏輯結構、設計網路的物理結構 網路設計的任務 確定網路總體目標 採用哪些網路技術和標準 確定網路規模 是否分期實施 網路的實施成本 執行成本等 確定總體設計原則 實用性原則 開放性原則

Apache CloudStack 4.5.2 新特性一覽

     Apache CloudStack 4.5.2 新特性一覽       CloudStack 4.5.2 相比前一個版本修復了大約 200 個Bug。

httpcomponents httpclient/4.5.5 https請求

轉https://www.cnblogs.com/songxingzhu/p/9015117.html   平時我們需要在JAVA中進行GET、POST、PUT、DELETE等請求時,使用第三方jar包會比較簡單。常用的工具包有: 1、https://github.com/ke

通過遠端在Window 2008 R2上安裝 .NET 4.5.2遇到的坑

這段時間同事寫了一個通過遠端PowerShell命令安裝.NET 4.5.2的PowerShell指令碼,在本地的時候,通過下面的PowerShell命令能安裝成功: C:\setup.NET-4.5.2-KB2901907-x86-x64-AllOS-ENU.exe /x86 /x

httpclient-4.5.1.jar

HttpPost httpPost = new HttpPost(REPORT_URL); httpPost.setConfig(requestConfig); 報The method setConfig(RequestConfig) is undefined for the type Http

安裝mysql時提示This application requires .NET framework 4.5.2的解決辦法

安裝mysql社群版的時候報這個錯:this application requires .NET Framework 4.5.2  解決方法:到這個地址https://www.microsoft.com/en-us/download/details.aspx?id=42642

php redis實現連線

什麼是連線池? redis連線靜態類。redis連線池 減少redis的重複連線,降低記憶體消耗! 通常情況下, 當我們需要做redis操作時, 會建立一個連線, 並基於這個連線進行redis操作, 操作完成後, 釋放連線,一般情況下, 這是沒問題的, 但當併發量比較高的

報錯:Win10 這臺計算機中已經安裝了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新

Win10系統自帶的.net framework版本為4.7,自己安裝.NET Framework 4.5.2時會提示:這臺計算機中已經安裝了 .NET Framework 4.5.2 或版本更高的更新。 解決方法 下載安裝.net framework的開發版或者說開發包。開發版地址h