Apache HttpClient - หลายเธรด

โปรแกรมแบบมัลติเธรดประกอบด้วยสองส่วนขึ้นไปที่สามารถทำงานพร้อมกันได้และแต่ละส่วนสามารถจัดการงานที่แตกต่างกันได้ในเวลาเดียวกันโดยใช้ทรัพยากรที่มีอยู่ให้เกิดประโยชน์สูงสุด

คุณสามารถดำเนินการร้องขอจากหลายเธรดโดยการเขียนโปรแกรม HttpClient แบบมัลติเธรด

หากคุณต้องการดำเนินการตามคำขอไคลเอ็นต์หลายรายการจากเธรดติดต่อกันคุณต้องสร้างไฟล์ ClientConnectionPoolManager. มันมีสระว่ายน้ำของHttpClientConnections และให้บริการคำขอหลายรายการจากเธรด

ตัวจัดการการเชื่อมต่อจะรวบรวมการเชื่อมต่อตามเส้นทาง หากผู้จัดการมีการเชื่อมต่อสำหรับเส้นทางใดเส้นทางหนึ่งระบบจะให้บริการคำขอใหม่ในเส้นทางเหล่านั้นโดยการเช่าการเชื่อมต่อที่มีอยู่จากพูลแทนที่จะสร้างเส้นทางใหม่

ทำตามขั้นตอนเพื่อดำเนินการร้องขอจากหลายเธรด -

ขั้นตอนที่ 1 - การสร้าง Client Connection Pool Manager

สร้าง Client Connection Pool Manager โดยสร้างอินสแตนซ์ 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

สร้างอินสแตนซ์คลาส HttpGet โดยส่ง URI ที่ต้องการไปยังตัวสร้างเป็นพารามิเตอร์

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

ขั้นตอนที่ 5 - การใช้งานวิธีการเรียกใช้

ตรวจสอบให้แน่ใจว่าคุณได้สร้างคลาสทำให้เป็นเธรด (ไม่ว่าจะโดยการขยายคลาสเธรดหรือโดยการใช้อินเทอร์เฟซ Runnable) และใช้วิธีการรัน

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

ขั้นตอนที่ 6 - สร้างวัตถุเธรด

สร้างอ็อบเจ็กต์เธรดโดยสร้างอินสแตนซ์คลาสเธรด (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 - เรียกใช้วิธีการ

ภายในวิธีการรันให้ดำเนินการตามคำขอเรียกข้อมูลการตอบกลับและพิมพ์ผลลัพธ์

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการดำเนินการของคำร้องขอ 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