Apache HttpClient - Banyak Untaian

Program multi-utas berisi dua atau lebih bagian yang dapat berjalan secara bersamaan dan setiap bagian dapat menangani tugas yang berbeda pada saat yang sama memanfaatkan sumber daya yang tersedia secara optimal.

Anda dapat menjalankan permintaan dari beberapa utas dengan menulis program HttpClient multithread.

Jika Anda ingin menjalankan beberapa permintaan klien dari utas secara berurutan, Anda perlu membuat file ClientConnectionPoolManager. Itu mempertahankan kolamHttpClientConnections dan melayani banyak permintaan dari utas.

Manajer koneksi mengumpulkan koneksi berdasarkan rute. Jika pengelola memiliki koneksi untuk rute tertentu, maka ia melayani permintaan baru di rute tersebut dengan menyewa koneksi yang ada dari kumpulan, alih-alih membuat yang baru.

Ikuti langkah-langkah untuk menjalankan permintaan dari beberapa utas -

Langkah 1 - Membuat Manajer Pool Koneksi Klien

Buat Client Connection Pool Manager dengan membuat instance PoolingHttpClientConnectionManager kelas.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Langkah 2 - Tetapkan jumlah koneksi maksimum

Tetapkan jumlah maksimum koneksi di pangkalan menggunakan setMaxTotal() metode.

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

Langkah 3 - Buat Objek ClientBuilder

Membuat ClientBuilder Objek dengan mengatur manajer koneksi menggunakan setConnectionManager() metode seperti yang ditunjukkan di bawah ini -

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

Langkah 4 - Buat objek permintaan HttpGet

Buat instance kelas HttpGet dengan meneruskan URI yang diinginkan ke konstruktornya sebagai parameter.

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

Langkah 5 - Menerapkan metode run

Pastikan Anda telah membuat kelas, menjadikannya thread (baik dengan memperluas kelas thread atau, dengan mengimplementasikan antarmuka Runnable) dan menerapkan metode run.

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

Langkah 6 - Buat objek Thread

Buat objek thread dengan membuat instance kelas Thread (ClientMultiThreaded) yang dibuat di atas.

Meneruskan objek HttpClient, masing-masing objek HttpGet dan, integer yang mewakili ID ke utas ini.

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

Langkah 7 - Mulai dan gabungkan utas

Mulai semua utas menggunakan start() metode dan bergabunglah dengan mereka menggunakan bergabung method().

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

Langkah 8 - Jalankan implementasi metode

Dalam metode run, jalankan permintaan, ambil respons dan cetak hasilnya.

Contoh

Contoh berikut menunjukkan eksekusi permintaan HTTP secara bersamaan dari beberapa utas. Dalam contoh ini, kami mencoba menjalankan berbagai permintaan dari berbagai utas dan mencoba mencetak status, dan jumlah byte yang dibaca oleh setiap klien.

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

Keluaran

Saat menjalankan, program di atas menghasilkan output berikut -

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