Apache HttpClient - wiele wątków
Program wielowątkowy zawiera dwie lub więcej części, które mogą działać równolegle, a każda część może obsługiwać inne zadanie w tym samym czasie, optymalnie wykorzystując dostępne zasoby.
Możesz wykonywać żądania z wielu wątków, pisząc wielowątkowy program HttpClient.
Jeśli chcesz kolejno wykonywać wiele żądań klientów z wątków, musisz utworzyć plik ClientConnectionPoolManager. Utrzymuje pulęHttpClientConnections i obsługuje wiele żądań z wątków.
Menedżer połączeń grupuje połączenia na podstawie trasy. Jeśli menedżer ma połączenia dla określonej trasy, obsługuje nowe żądania w tych trasach, dzierżawąc istniejące połączenie z puli, zamiast tworzyć nowe.
Postępuj zgodnie z instrukcjami, aby wykonywać żądania z wielu wątków -
Krok 1 - Tworzenie Menedżera puli połączeń klientów
Utwórz Menedżera puli połączeń klientów, tworząc wystąpienie PoolingHttpClientConnectionManager klasa.
PoolingHttpClientConnectionManager connManager = new
PoolingHttpClientConnectionManager();
Krok 2 - Ustaw maksymalną liczbę połączeń
Ustaw maksymalną liczbę połączeń w puli przy użyciu setMaxTotal() metoda.
//Set the maximum number of connections in the pool
connManager.setMaxTotal(100);
Krok 3 - Utwórz obiekt ClientBuilder
Stwórz ClientBuilder Obiekt, ustawiając menedżera połączeń za pomocą setConnectionManager() metoda, jak pokazano poniżej -
HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);
Krok 4 - Utwórz obiekty żądania HttpGet
Utwórz wystąpienie klasy HttpGet, przekazując żądany identyfikator URI do jej konstruktora jako parametr.
HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . .
Krok 5 - Implementacja metody run
Upewnij się, że utworzyłeś klasę, utworzyłeś z niej wątek (albo przez rozszerzenie klasy wątku, albo przez zaimplementowanie interfejsu Runnable) i zaimplementowano metodę run.
public class ClientMultiThreaded extends Thread {
public void run() {
//Run method implementation . . . . . . . . . .
}
}
Krok 6 - Utwórz obiekty Thread
Utwórz obiekty wątku, tworząc wystąpienie klasy Thread (ClientMultiThreaded) utworzonej powyżej.
Przekaż obiekt HttpClient, odpowiedni obiekt HttpGet i liczbę całkowitą reprezentującą identyfikator do tych wątków.
ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Krok 7 - Rozpocznij i dołącz do wątków
Uruchom wszystkie wątki za pomocą start() i dołącz do nich przy użyciu metody join method().
thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .
Krok 8 - Uruchom implementację metody
W ramach metody run wykonaj żądanie, pobierz odpowiedź i wydrukuj wyniki.
Przykład
Poniższy przykład demonstruje jednoczesne wykonywanie żądań HTTP z wielu wątków. W tym przykładzie próbujemy wykonać różne żądania z różnych wątków i próbujemy wydrukować stan oraz liczbę bajtów odczytywanych przez każdego klienta.
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();
}
}
Wynik
Podczas wykonywania powyższy program generuje następujące dane wyjściowe -
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