HTTPClientの接続プールのテスト

なぜあなたは、http接続プールを使用する必要があります

1、遅延削減:接続プールを使用していない場合は、HTTP要求は(スリーウェイハンドシェイクを介して)TCPコネクションを再確立するとき、すべての接続が開始され、使用済み閉じ接続(4揺れ)を、接続プールが低減されている場合このパートタイムのロスは、過小評価しないいくつかの握手を行い、私がテストされ、実質的に3倍の時間遅延を発見されています

2、より高い同時実行のためのサポート:あなたは、接続プーリングを使用しない場合は、すべての接続は、それが不可能な新しい接続を確立すること、ポートシステムリソースがすぐに大規模な同時の場合に排出され、ポートを開きます。

 

接続プールの例

接続プールマネージャコード

輸入org.apache.http.config.Registry;
輸入org.apache.http.config.RegistryBuilder。
輸入org.apache.http.conn.socket.ConnectionSocketFactory。
輸入org.apache.http.conn.socket.LayeredConnectionSocketFactory。
輸入org.apache.http.conn.socket.PlainConnectionSocketFactory。
輸入org.apache.http.conn.ssl.SSLConnectionSocketFactory。
輸入org.apache.http.impl.client.CloseableHttpClient;
輸入org.apache.http.impl.client.HttpClients。
輸入org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

輸入javax.annotation.PostConstruct;
輸入javax.net.ssl.SSLContext;
輸入java.security.NoSuchAlgorithmException。

パブリック クラスHttpConnectionManager {

    PoolingHttpClientConnectionManagerセンチ = nullを

    @PostConstruct
    公共 のinit(){
        LayeredConnectionSocketFactory sslsf = nullをしてみてください{
            sslsf = 新しいSSLConnectionSocketFactory(SSLContext.getDefault());
        } キャッチ(持つNoSuchAlgorithmException電子){
            e.printStackTrace();
        }


        レジストリ <ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder。<ConnectionSocketFactory> ()を作成します
                .register( "HTTPS" 、sslsf)
                .register( "HTTP"、PlainConnectionSocketFactory())
                .build()。
        CM = 新しいPoolingHttpClientConnectionManager(socketFactoryRegistry)。
        cm.setMaxTotal( 200 )。
        cm.setDefaultMaxPerRoute( 20 )。
    }

    公共CloseableHttpClient getHttpClient(){
        CloseableHttpClientのHttpClient = HttpClients.custom()
                .setConnectionManagerさ(cm)
                .build()。

        / * CloseableHttpClient HttpClientをHttpClients.createDefault =(); //接続プールが接続得るためにこのように使用されていない場合* / 
        リターンのHttpClient。
    }
}

使用接続プーリングコード

プライベート 静的CloseableHttpClient getHttpClient(){
        HttpConnectionManager httpConnectionManager =(HttpConnectionManager)AppBeanUtil.getBean( "httpConnectionManager" )。
        返す  httpConnectionManager.getHttpClientを();
    }

接続しなさい

公共の 静的な文字列getFromUrl(文字列のURL、地図<文字列、文字列>のparams、String型の文字セット)がスロー例外{
         場合(StringUtil.isEmpty(文字セットを)){
            文字セット = defaultCharset。
        }
        CloseableHttpClientのHTTPClient = getHttpClient()。
        URIBuilder uriBuilder = 新しいURIBuilder(URL);
        uriBuilder.setCharset(Charset.forName(文字セット))。
        もし(のparams!= nullの){
            反復子の<string> keyIt = params.keySet()反復子()。
            一方、(keyIt.hasNext()){
                文字列キー = keyIt.next()。
                ストリングヴァル = params.get(キー)。
                uriBuilder.setParameter(キー、val)で、
            }
        }
        URI URI = uriBuilder.build()。

        HTTPGET HTTPGET = 新しいHTTPGET(URI)。

        CloseableHttpResponse応答 = httpclient.execute(HTTPGET)。
        してみてください{
            HttpEntityエンティティ = response.getEntity()。
            もし(エンティティ!= nullの){
                文字列の内容 = のgetContent(entity.getContent())。
                戻り値の内容;
            }
        } 最後に{
            )(response.close。
        }
        リターン ヌル
    }

アクセス内容を取得するURL

プライベート 静的文字列のgetContent(入力ストリームインストリーム)は、スローIOExceptionが{
        StringWriterライター = 新しいにStringWriter();
        IOUtils.copy(インストリーム、作家、defaultCharset)。
        instream.close();
        リターンwriter.toString();
    }

必要なインストリームが閉じてデータの読み出し、。

効率試験を接続プーリングを使用して、接続プールをテストしていません。

@Test
     公共 ボイド事後テスト()がスロー例外{

        長い =開始)(のSystem.currentTimeMillis。
        以下のためにINT ; I <200; iが0 = I ++ ){
            文字列の内容 = HttpClientPoolUtil.postFromUrl( "https://www.cnblogs.com/kingszelda/p/8988505.html"、新たな HashMapの<> ());
        }
        System.err.println(「---------------------------事後--------------- ------------」);
        System.err.println(のSystem.currentTimeMillis() - 開始)。

        System.err.println(「---------------------------事後--------------- ------------」);
        開始 = のSystem.currentTimeMillis();
        以下のためにINT ; I <200; iが0 = I ++ ){
            文字列の内容 = HttpClientUtil.postFromUrl( "https://www.cnblogs.com/kingszelda/p/8988505.html"、新たな HashMapの<> ());
        }
        System.err.println(のSystem.currentTimeMillis() - 開始)。


    }

テスト結果

---------------------------事後---------------------- -----
9791
---------------------------事後---------------- -----------
39427

それは39.4秒、30秒の時間差を接続プーリングを使用せずに9.7秒の200の支出時間へのアクセスを接続プーリングの使用で見ることができます。

送信要求と受信から計算要求により各時間150ミリ秒かかる接続を確立するために約48ミリ秒を要し、非常に接続可視消費性能を作成する必要があることです。

 

おすすめ

転載: www.cnblogs.com/yg_zhang/p/12239409.html