Apache HttpClient-다중 스레드

다중 스레드 프로그램에는 동시에 실행할 수있는 두 개 이상의 부분이 포함되어 있으며 각 부분은 사용 가능한 리소스를 최적으로 사용하여 동시에 다른 작업을 처리 할 수 ​​있습니다.

다중 스레드 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 단계-실행 방법 구현

클래스를 만들고 스레드로 만들고 (스레드 클래스를 확장하거나 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