Apache HttpClient - Birden Çok İş Parçacığı

Çok iş parçacıklı bir program, eşzamanlı olarak çalışabilen iki veya daha fazla parça içerir ve her parça aynı anda farklı bir görevi yerine getirerek mevcut kaynakları en iyi şekilde kullanabilir.

Çok iş parçacıklı bir HttpClient programı yazarak birden çok iş parçacığından istekleri yürütebilirsiniz.

Ardışık olarak iş parçacıklarından birden fazla istemci isteği yürütmek istiyorsanız, bir ClientConnectionPoolManager. Bir havuz sağlarHttpClientConnections ve iş parçacıklarından birden çok istek sunar.

Bağlantı yöneticisi, bağlantıları rotaya göre havuzlar. Yöneticinin belirli bir yol için bağlantıları varsa, yeni bir bağlantı oluşturmak yerine havuzdan mevcut bir bağlantıyı kiralayarak bu yollarda yeni isteklere hizmet eder.

Birden çok iş parçacığından istekleri yürütmek için adımları izleyin -

Adım 1 - İstemci Bağlantı Havuzu Yöneticisinin Oluşturulması

İstemci Bağlantı Havuzu Yöneticisi'ni oluşturun. PoolingHttpClientConnectionManager sınıf.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Adım 2 - Maksimum bağlantı sayısını ayarlayın

Havuzdaki maksimum bağlantı sayısını ayarlayın. setMaxTotal() yöntem.

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

Adım 3 - ClientBuilder Nesnesi Oluşturun

Oluşturmak ClientBuilder Bağlantı yöneticisini kullanarak nesneyi setConnectionManager() aşağıda gösterildiği gibi yöntem -

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

Adım 4 - HttpGet istek nesnelerini oluşturun

İstenen URI'yi yapıcısına parametre olarak ileterek HttpGet sınıfını örnekleyin.

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

Adım 5 - Çalıştırma yönteminin uygulanması

Bir sınıf oluşturduğunuzdan, onu bir iş parçacığı haline getirdiğinizden (iş parçacığı sınıfını genişleterek veya Runnable arabirimini uygulayarak) ve run yöntemini uyguladığınızdan emin olun.

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

Adım 6 - Konu nesneleri oluşturun

Yukarıda oluşturulan Thread sınıfını (ClientMultiThreaded) somutlaştırarak iş parçacığı nesneleri oluşturun.

Bir HttpClient nesnesi, ilgili HttpGet nesnesi ve kimliği temsil eden bir tamsayı bu iş parçacıkları için iletin.

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

Adım 7 - Başlayın ve konuları birleştirin

Kullanarak tüm konuları başlatın start() yöntemi ve birleştirmeyi kullanarak onlara katılın method().

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

Adım 8 - Yöntem uygulamasını çalıştırın

Çalıştırma yöntemi içinde, isteği yürütün, yanıtı alın ve sonuçları yazdırın.

Misal

Aşağıdaki örnek, HTTP isteklerinin aynı anda birden çok iş parçacığından yürütülmesini gösterir. Bu örnekte, çeşitli iş parçacıklarından çeşitli istekleri yerine getirmeye ve durumu ve her istemci tarafından okunan bayt sayısını yazdırmaya çalışıyoruz.

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();
   }
}

Çıktı

Yürütüldüğünde, yukarıdaki program aşağıdaki çıktıyı üretir -

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