httpasyncclient的使用

相關(guān)blog鏈接https://blog.csdn.net/ouyang111222/article/details/78884634
pom文件內(nèi)引入對(duì)應(yīng)jar文件

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
            <version>4.1</version>
        </dependency>

新建httpUtil類


public class HttpUtil {

    private static int socketTimeout = 1000;// 設(shè)置等待數(shù)據(jù)超時(shí)時(shí)間5秒鐘 根據(jù)業(yè)務(wù)調(diào)整

    private static int connectTimeout = 2000;// 連接超時(shí)

    private static int poolSize = 100;// 連接池最大連接數(shù)

    private static int maxPerRoute = 10;// 每個(gè)主機(jī)的并發(fā)最多10


    /**
     * 創(chuàng)建非異步的可關(guān)閉的且跳過(guò)https 驗(yàn)證的 httpClient
     * @return
     */
    public static CloseableHttpClient createSSLClientDefault() {
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();
    }

    /**
     * 創(chuàng)建異步的可關(guān)閉的跳過(guò)https驗(yàn)證的 httpClient對(duì)象
     * @param connManager  連接管理器  可以調(diào)用本類的getConnManager 生成
     * @return
     */
    public static CloseableHttpAsyncClient getClient(PoolingNHttpClientConnectionManager connManager) {
        if (null == connManager) {
            return null;
        }
        // 設(shè)置連接參數(shù)
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(HttpUtil.socketTimeout).setConnectTimeout(HttpUtil.connectTimeout).build();
        // 創(chuàng)建自定義的httpclient對(duì)象
        CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connManager).disableCookieManagement().build();
        return client;
    }

    /**
     * 創(chuàng)建異步的可關(guān)閉的跳過(guò)https驗(yàn)證的 httpClient對(duì)象(綁定本地網(wǎng)卡)
     * @param connManager
     * @param localAddress
     * @return
     * @throws
     */
    public static CloseableHttpAsyncClient getClient(PoolingNHttpClientConnectionManager connManager, String localAddress) throws UnknownHostException {
        if (null == connManager || null == localAddress) {
            return null;
        }
        String[] ipStrArr = localAddress.split("\\.");
        if(ipStrArr.length != 4){
            return null;
        }
        byte[] ip = new byte[]{ (byte)(Integer.parseInt(ipStrArr[0])), (byte) (Integer.parseInt(ipStrArr[1])), (byte) (Integer.parseInt(ipStrArr[2])), (byte) (Integer.parseInt(ipStrArr[3])) };

        // 設(shè)置連接參數(shù)
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(HttpUtil.socketTimeout).setConnectTimeout(HttpUtil.connectTimeout).setLocalAddress(InetAddress.getByAddress(ip)).build();
        // 創(chuàng)建自定義的httpclient對(duì)象
        CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connManager).disableCookieManagement().build();
        return client;
    }

    /**
     * 初始化 連接管理器
     * @return
     */
    public static PoolingNHttpClientConnectionManager getConnManager() {

        try {
            // 繞過(guò)證書(shū)驗(yàn)證蚣录,處理https請(qǐng)求
            SSLContext sslcontext = createIgnoreVerifySSL();

            // 設(shè)置協(xié)議http和https對(duì)應(yīng)的處理socket鏈接工廠的對(duì)象
            Registry<SchemeIOSessionStrategy> sessionStrategyRegistry = RegistryBuilder
                    .<SchemeIOSessionStrategy> create().register("http", NoopIOSessionStrategy.INSTANCE)
                    .register("https", new SSLIOSessionStrategy(sslcontext, new AllowAllHostnameVerifier())).build();
            // 配置io線程
            IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setConnectTimeout(HttpUtil.socketTimeout).setSoTimeout(HttpUtil.connectTimeout)
                    .setRcvBufSize(8192).setSndBufSize(8192).build();

            // 設(shè)置連接池大小
            ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);

            PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor, null,
                    sessionStrategyRegistry, null);
            connManager.setDefaultMaxPerRoute(maxPerRoute);
            connManager.setMaxTotal(poolSize);
            return connManager;
        } catch (IOReactorException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 繞過(guò)驗(yàn)證
     *
     * @return
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    public static SSLContext createIgnoreVerifySSL() {
        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance("TLS");
            // 實(shí)現(xiàn)一個(gè)X509TrustManager接口技竟,用于繞過(guò)驗(yàn)證,不用修改里面的方法
            X509TrustManager trustManager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            sc.init(null, new TrustManager[] { trustManager }, null);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (KeyManagementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sc;

    }
}

創(chuàng)建調(diào)用工廠

@Component
public class AsynHttpClientFactory {

    private static Logger logger = LoggerFactory.getLogger(AsynHttpClientFactory.class);


    private static CloseableHttpAsyncClient httpclient;
    private static PoolingNHttpClientConnectionManager connManager;
    public AsynHttpClientFactory() {
        connManager = HttpUtil.getConnManager();
        httpclient = HttpUtil.getClient(connManager);
        httpclient.start();
        logger.info("異步httpClient啟動(dòng)完成");
    }

    public static CloseableHttpAsyncClient getCloseableHttpAsyncClient(){
        return httpclient;
    }
}

測(cè)試實(shí)例

 CloseableHttpAsyncClient httpClient = AsynHttpClientFactory.getCloseableHttpAsyncClient();
        final CountDownLatch latch = new CountDownLatch(urls.length);
        for(final HttpGet request: urls){

            Future<HttpResponse> future =  httpClient.execute(request,  new FutureCallback(){
                @Override
                public void completed(Object obj) {
                    final HttpResponse response = (HttpResponse)obj;
                    latch.countDown();
                    PlatformInfo platformInfo =  map.get(request.getURI().toString());
                    if( response.getStatusLine().getStatusCode() == 200){
                        if(platformInfo != null){
                            platformInfo.setStatus(PlatformStatus.SUCCESS.getStatus());
                        }
                    }else{
                        if(platformInfo != null){
                            platformInfo.setStatus(PlatformStatus.ERROR.getStatus());
                        }
                    }

                }

                @Override
                public void failed(Exception excptn) {
                    latch.countDown();
                    PlatformInfo platformInfo =  map.get(request.getURI().toString());
                    if(platformInfo != null){
                        platformInfo.setStatus(PlatformStatus.ERROR.getStatus());
                    }
                }

                @Override
                public void cancelled() {
                    latch.countDown();
                    PlatformInfo platformInfo =  map.get(request.getURI().toString());
                    if(platformInfo != null){
                        platformInfo.setStatus(PlatformStatus.ERROR.getStatus());
                    }
                }

            });
           /* HttpResponse response = future.get();
            PlatformInfo platformInfo =  map.get(request.getURI().toString());
            if(response.getStatusLine().getStatusCode() == 200){
                if(platformInfo != null){
                    platformInfo.setStatus(PlatformStatus.SUCCESS.getStatus());
                }
            };*/
            request.releaseConnection();
        }

        try {
            latch.await();
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error("定時(shí)任務(wù)出錯(cuò):"+ex.getMessage());
        }
       /*
        finally{
            try {
                httpClient.close();
            }
            catch (IOException ex) {
                logger.error("定時(shí)任務(wù)出錯(cuò):"+ex.getMessage());
            }
        }*/
        /*try {
            httpClient.close();
        }
        catch (IOException ex) {
            logger.error("定時(shí)任務(wù)出錯(cuò):"+ex.getMessage());
        }*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末新翎,一起剝皮案震驚了整個(gè)濱河市寥闪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件值朋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巩搏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)趾代,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贯底,“玉大人,你說(shuō)我怎么就攤上這事撒强∏堇Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵飘哨,是天一觀的道長(zhǎng)胚想。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芽隆,這世上最難降的妖魔是什么浊服? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮胚吁,結(jié)果婚禮上牙躺,老公的妹妹穿的比我還像新娘。我一直安慰自己腕扶,他們只是感情好孽拷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著半抱,像睡著了一般脓恕。 火紅的嫁衣襯著肌膚如雪膜宋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天炼幔,我揣著相機(jī)與錄音秋茫,去河邊找鬼。 笑死江掩,一個(gè)胖子當(dāng)著我的面吹牛学辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环形,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼策泣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抬吟?” 一聲冷哼從身側(cè)響起萨咕,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎火本,沒(méi)想到半個(gè)月后危队,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體允懂,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送挑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逃延。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擎析。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡簿盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揍魂,到底是詐尸還是另有隱情桨醋,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布现斋,位于F島的核電站喜最,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庄蹋。R本人自食惡果不足惜瞬内,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔓肯。 院中可真熱鬧遂鹊,春花似錦、人聲如沸蔗包。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至舟陆,卻和暖如春误澳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秦躯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工忆谓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踱承。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓倡缠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親茎活。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昙沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,327評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料载荔? 從這篇文章中你...
    hw1212閱讀 12,754評(píng)論 2 59
  • 本系列出于AWeiLoveAndroid的分享盾饮,在此感謝,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺懒熙,完善答案丘损。以成系統(tǒng)。 Java基...
    濟(jì)公大將閱讀 1,529評(píng)論 1 6
  • 人生欠債總是要還的蔬浙,在這段復(fù)雜的婚姻中,消磨自己已是第八個(gè)年頭贞远,每天在怒畴博、怨、嗔蓝仲、癡中折磨自己俱病,變成一名怨婦,時(shí)刻...
    風(fēng)信子的小世界閱讀 4,309評(píng)論 0 2
  • 今天來(lái)談一談“詩(shī)仙”李白,估計(jì)在中國(guó)沒(méi)有人沒(méi)背過(guò)李白的詩(shī)垢夹,可謂是膾炙人口溢吻。他的詩(shī)歌特點(diǎn)是擁有超人間的浪漫情懷,大多...
    小歸ing閱讀 708評(píng)論 5 9