ApacheHttpClient-複数のスレッド

マルチスレッドプログラムには、同時に実行できる2つ以上のパーツが含まれており、各パーツは、使用可能なリソースを最適に利用して、異なるタスクを同時に処理できます。

マルチスレッドのHttpClientプログラムを作成することにより、複数のスレッドからの要求を実行できます。

スレッドから複数のクライアントリクエストを連続して実行する場合は、を作成する必要があります ClientConnectionPoolManager。それはのプールを維持しますHttpClientConnections スレッドからの複数のリクエストを処理します。

接続マネージャーは、ルートに基づいて接続をプールします。マネージャが特定のルートへの接続を持っている場合、新しい接続を作成する代わりに、プールから既存の接続をリースすることにより、それらのルートで新しい要求を処理します。

手順に従って、複数のスレッドからリクエストを実行します-

ステップ1-クライアント接続プールマネージャの作成

をインスタンス化して、クライアント接続プールマネージャを作成します PoolingHttpClientConnectionManager クラス。

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

ステップ2-接続の最大数を設定します

を使用して、プール内の接続の最大数を設定します。 setMaxTotal() 方法。

//Set the maximum number of connections in the pool
connManager.setMaxTotal(100);

ステップ3-ClientBuilderオブジェクトを作成する

作成する ClientBuilder を使用して接続マネージャーを設定することによるオブジェクト setConnectionManager() 以下に示す方法-

HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);

ステップ4-HttpGetリクエストオブジェクトを作成する

目的のURIをコンストラクターにパラメーターとして渡すことにより、HttpGetクラスをインスタンス化します。

HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . .

ステップ5-runメソッドを実装する

クラスを作成し、それをスレッドにして(スレッドクラスを拡張するか、Runnableインターフェイスを実装することにより)、runメソッドを実装したことを確認してください。

public class ClientMultiThreaded extends Thread {
   public void run() {
      //Run method implementation . . . . . . . . . .
   }
}

ステップ6-スレッドオブジェクトを作成する

上で作成したThreadクラス(ClientMultiThreaded)をインスタンス化して、スレッドオブジェクトを作成します。

HttpClientオブジェクト、それぞれのHttpGetオブジェクト、およびIDを表す整数をこれらのスレッドに渡します。

ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ステップ7-スレッドを開始して参加する

を使用してすべてのスレッドを開始します start() メソッドと結合を使用してそれらを結合します method()

thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .

ステップ8-メソッド実装を実行する

runメソッド内で、リクエストを実行し、レスポンスを取得して、結果を出力します。

次の例は、複数のスレッドから同時にHTTPリクエストを実行する方法を示しています。この例では、さまざまなスレッドからさまざまな要求を実行し、ステータスと各クライアントによって読み取られたバイト数を出力しようとしています。

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class ClientMultiThreaded extends Thread {
   CloseableHttpClient httpClient;
   HttpGet httpget;
   int id;
 
   public ClientMultiThreaded(CloseableHttpClient httpClient, HttpGet httpget,
   int id) {
      this.httpClient = httpClient;
      this.httpget = httpget;
      this.id = id;
   }
   @Override
   public void run() {
      try{
         //Executing the request
         CloseableHttpResponse httpresponse = httpClient.execute(httpget);

         //Displaying the status of the request.
         System.out.println("status of thread "+id+":"+httpresponse.getStatusLine());

         //Retrieving the HttpEntity and displaying the no.of bytes read
         HttpEntity entity = httpresponse.getEntity();
         if (entity != null) {
            System.out.println("Bytes read by thread thread "+id+":
               "+EntityUtils.toByteArray(entity).length);
         }
      }catch(Exception e) {
         System.out.println(e.getMessage());
      }
   }
      
   public static void main(String[] args) throws Exception {

      //Creating the Client Connection Pool Manager by instantiating the PoolingHttpClientConnectionManager class.
      PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

      //Set the maximum number of connections in the pool
      connManager.setMaxTotal(100);

      //Create a ClientBuilder Object by setting the connection manager
      HttpClientBuilder clientbuilder = HttpClients.custom().setConnectionManager(connManager);
 
      //Build the CloseableHttpClient object using the build() method.
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating the HttpGet requests
      HttpGet httpget1 = new HttpGet("http://www.tutorialspoint.com/");
      HttpGet httpget2 = new HttpGet("http://www.google.com/");
      HttpGet httpget3 = new HttpGet("https://www.qries.com/");
      HttpGet httpget4 = new HttpGet("https://in.yahoo.com/");
 
      //Creating the Thread objects
      ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
      ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
      ClientMultiThreaded thread3 = new ClientMultiThreaded(httpclient,httpget3, 3);
      ClientMultiThreaded thread4 = new ClientMultiThreaded(httpclient,httpget4, 4);

      //Starting all the threads
      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();

      //Joining all the threads
      thread1.join();
      thread2.join();
      thread3.join();
      thread4.join();
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

status of thread 1: HTTP/1.1 200 OK
Bytes read by thread thread 1: 36907
status of thread 2: HTTP/1.1 200 OK
Bytes read by thread thread 2: 13725
status of thread 3: HTTP/1.1 200 OK
Bytes read by thread thread 3: 17319
status of thread 4: HTTP/1.1 200 OK
Bytes read by thread thread 4: 127018