Apache HttpClient - Nhiều chủ đề

Một chương trình đa luồng chứa hai hoặc nhiều phần có thể chạy đồng thời và mỗi phần có thể xử lý một nhiệm vụ khác nhau cùng một lúc để sử dụng tối ưu các tài nguyên có sẵn.

Bạn có thể thực hiện các yêu cầu từ nhiều luồng bằng cách viết một chương trình HttpClient đa luồng.

Nếu bạn muốn thực hiện nhiều yêu cầu khách hàng từ các chuỗi liên tục, bạn cần tạo ClientConnectionPoolManager. Nó duy trì một nhómHttpClientConnections và phục vụ nhiều yêu cầu từ các chủ đề.

Trình quản lý kết nối gộp các kết nối dựa trên tuyến đường. Nếu trình quản lý có các kết nối cho một tuyến đường cụ thể, thì nó sẽ phục vụ các yêu cầu mới trong các tuyến đường đó bằng cách cho thuê một kết nối hiện có từ nhóm, thay vì tạo một kết nối mới.

Làm theo các bước để thực hiện yêu cầu từ nhiều chuỗi -

Bước 1 - Tạo Trình quản lý nhóm kết nối máy khách

Tạo Trình quản lý nhóm kết nối máy khách bằng cách khởi tạo PoolingHttpClientConnectionManager lớp học.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Bước 2 - Đặt số lượng kết nối tối đa

Đặt số lượng kết nối tối đa trong nhóm bằng cách sử dụng setMaxTotal() phương pháp.

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

Bước 3 - Tạo một đối tượng ClientBuilder

Tạo một ClientBuilder Đối tượng bằng cách đặt trình quản lý kết nối bằng cách sử dụng setConnectionManager() như hình dưới đây -

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

Bước 4 - Tạo các đối tượng yêu cầu HttpGet

Khởi tạo lớp HttpGet bằng cách chuyển URI mong muốn đến phương thức khởi tạo của nó dưới dạng tham số.

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

Bước 5 - Triển khai phương thức chạy

Đảm bảo rằng bạn đã tạo một lớp, biến nó thành một luồng (bằng cách mở rộng lớp luồng hoặc bằng cách triển khai giao diện Runnable) và triển khai phương thức run.

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

Bước 6 - Tạo đối tượng Chủ đề

Tạo đối tượng luồng bằng cách khởi tạo lớp Thread (ClientMultiThreaded) đã tạo ở trên.

Truyền một đối tượng HttpClient, đối tượng HttpGet tương ứng và, một số nguyên đại diện cho ID đến các luồng này.

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

Bước 7 - Bắt đầu và tham gia các chuỗi

Bắt đầu tất cả các chuỗi bằng cách sử dụng start() phương pháp và tham gia với họ bằng cách tham gia method().

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

Bước 8 - Chạy triển khai phương pháp

Trong phương thức chạy, thực hiện yêu cầu, truy xuất phản hồi và in kết quả.

Thí dụ

Ví dụ sau minh họa việc thực thi các yêu cầu HTTP đồng thời từ nhiều luồng. Trong ví dụ này, chúng tôi đang cố gắng thực hiện các yêu cầu khác nhau từ các luồng khác nhau và cố gắng in trạng thái và số byte được đọc bởi mỗi máy khách.

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

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau:

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