Apache HttpClient - Più thread
Un programma multi-thread contiene due o più parti che possono essere eseguite contemporaneamente e ciascuna parte può gestire un'attività diversa allo stesso tempo, facendo un uso ottimale delle risorse disponibili.
È possibile eseguire richieste da più thread scrivendo un programma HttpClient multithread.
Se si desidera eseguire più richieste client dai thread consecutivamente, è necessario creare un file ClientConnectionPoolManager. Mantiene un pool diHttpClientConnections e serve più richieste dai thread.
Il gestore delle connessioni raggruppa le connessioni in base al percorso. Se il gestore dispone di connessioni per una determinata route, serve nuove richieste in tali route affittando una connessione esistente dal pool, invece di crearne una nuova.
Segui i passaggi per eseguire richieste da più thread:
Passaggio 1: creazione di Client Connection Pool Manager
Creare il Client Connection Pool Manager istanziando il file PoolingHttpClientConnectionManager classe.
PoolingHttpClientConnectionManager connManager = new
PoolingHttpClientConnectionManager();
Passaggio 2: impostare il numero massimo di connessioni
Impostare il numero massimo di connessioni nel pool utilizzando il setMaxTotal() metodo.
//Set the maximum number of connections in the pool
connManager.setMaxTotal(100);
Passaggio 3: creare un oggetto ClientBuilder
Creare un ClientBuilder Oggetto impostando il gestore della connessione utilizzando il setConnectionManager() metodo come mostrato di seguito -
HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);
Passaggio 4: creare gli oggetti di richiesta HttpGet
Creare un'istanza della classe HttpGet passando l'URI desiderato al relativo costruttore come parametro.
HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . .
Passaggio 5: implementazione del metodo di esecuzione
Assicurati di aver creato una classe, di averlo reso un thread (estendendo la classe di thread o implementando l'interfaccia Runnable) e implementato il metodo run.
public class ClientMultiThreaded extends Thread {
public void run() {
//Run method implementation . . . . . . . . . .
}
}
Passaggio 6: creare oggetti Thread
Crea oggetti thread istanziando la classe Thread (ClientMultiThreaded) creata sopra.
Passa un oggetto HttpClient, il rispettivo oggetto HttpGet e un numero intero che rappresenta l'ID a questi thread.
ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Passaggio 7: avviare e unire i thread
Inizia tutti i thread usando start() metodo e unisciti a loro usando il join method().
thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .
Passaggio 8: eseguire l'implementazione del metodo
All'interno del metodo run, eseguire la richiesta, recuperare la risposta e stampare i risultati.
Esempio
L'esempio seguente mostra l'esecuzione simultanea di richieste HTTP da più thread. In questo esempio, stiamo tentando di eseguire varie richieste da vari thread e tentando di stampare lo stato e il numero di byte letti da ogni client.
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();
}
}
Produzione
In esecuzione, il programma precedente genera il seguente output:
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