web-dev-qa-db-ja.com

HttpClientを使用したHTTP接続プーリング

  • HttpClientを使用して接続のプールを作成するにはどうすればよいですか?
  • 同じサーバーに頻繁に接続する必要があります。そのようなプールを作成する価値はありますか?
  • ライブ接続を維持し、それをさまざまなリクエストに使用することはできますか?

Apache HTTP Client を使用して、Javaで開発しています。

26
John

[JavaとApacheのHttpClientを想定]

ThreadSafeClientConnManager を使用します。単一のグローバルインスタンスをすべてのHttpClientインスタンスのコンストラクターに渡します。 HttpClient自体をプールすることに意味はないと思います。

16
Tom Anderson

PoolingClientConnectionManagerは非推奨になりました。 (4.3バージョン)からPoolingHttpClientConnectionManagerを使用します。

20
pssh

私は最近これに取り組んでいるので、「誰もが知っている」知識をあなたと共有したいだけです。

まず、同じサーバーを扱っているため、単一のHTTPクライアントを使用して要求を実行することをお勧めします。 PoolingHttpClientConnectionManagerを使用すると、クライアントを使用して複数の要求を同時に実行できます。マルチスレッドのリクエスト実行の公式例は here にあります。

次に、HTTP/1.1(およびHTTP/1.0の拡張バージョン)により、HTTPクライアントは、トランザクションが完了した後も接続を開いたままにしておくことができ、将来のリクエストで再利用できます。多くの場合、これはPersistent Connectionと呼ばれます。

また、複数のリクエストでクライアントを再利用するために、サーバーからの応答ヘッダーには属性呼び出しKeep-Alive現在の接続が維持される時間を含む。それに加えて、Apache Http Clientは、接続を再利用するための独自のポリシーをカスタマイズするためのインターフェイスConnectionKeepAliveStrategyも提供します。

20
eriknguyen

ThreadSafeClientConnManagerは非推奨になりました。代わりに PoolingClientConnectionManager を使用してください。

15
Manoj N V

HttpClient 4xの場合:

ThreadSafeClientConnManager ...は、クライアント接続のプールを管理し、複数の実行スレッドからの接続要求を処理できます。

接続はルートごとにプールされます。マネージャーがプールで利用可能な永続的な接続をすでに持っているルートのリクエストは、プールを作成するのではなく、プールから接続をリースすることで処理されます新しい接続。

http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

8
serg.nechaev

これは、認証を必要としない接続のApache HttpClient 4.3プールの例です。

public class PoolOfHttpConnections{
   static String[] urisToGet = {"http://www.site1.com", "http://www.site2.com"};

    public static void main(String[] args) throws Exception {
           CloseableHttpClient httpclient = HttpClients.createDefault();
           // create a thread for each link
           GetThread[] threads = new GetThread[urisToGet.length];
           for (int i = 0; i < threads.length; i++) {
               HttpGet httpget = new HttpGet(urisToGet[i]);
               threads[i] = new GetThread(httpClient, httpget);
           }

           // start the threads
           for (int j = 0; j < threads.length; j++) {
               threads[j].start();
           }
           // join the threads
           for (int j = 0; j < threads.length; j++) {
               threads[j].join();
           }
    } //end main

    private static class GetThread extends Thread {

            private final CloseableHttpClient httpClient;
            private final HttpContext context;
            private final HttpGet httpget;

            public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
                   this.httpClient = httpClient;
                   this.context = HttpClientContext.create();
                   this.httpget = httpget;
            }

            @Override
            public void run() {
                   try {
                       CloseableHttpResponse response = httpClient.execute(httpget, context);
                       try {
                           HttpEntity entity = response.getEntity();
                           System.out.println("----------------------------------------");
                           Date date = new Date();
                           System.out.println("Beginning*******************");
                           System.out.println(date.toString());
                           System.out.println("There are "+urisToGet.length+" threads running in parallel!");
                           System.out.println(response.getStatusLine());
                           if (entity != null) {
                              System.out.println("Response content length: " + entity.getContentLength());
                           }
                           System.out.println(EntityUtils.toString(entity));
                           EntityUtils.consume(entity);
                       } finally {
                         response.close();
                         System.out.println("End*******************");
                       }
                   } catch (ClientProtocolException ex) {
                          // Handle protocol errors
                   } catch (IOException ex) {
                          // Handle I/O errors
                   }
            }
    } /*end private class*/  }//end public class PoolOfHttpConnections
2
Octavian Ionel