Apache HttpClient - Birden Çok İş Parçacığı
Çok iş parçacıklı bir program, eşzamanlı olarak çalışabilen iki veya daha fazla parça içerir ve her parça aynı anda farklı bir görevi yerine getirerek mevcut kaynakları en iyi şekilde kullanabilir.
Çok iş parçacıklı bir HttpClient programı yazarak birden çok iş parçacığından istekleri yürütebilirsiniz.
Ardışık olarak iş parçacıklarından birden fazla istemci isteği yürütmek istiyorsanız, bir ClientConnectionPoolManager. Bir havuz sağlarHttpClientConnections ve iş parçacıklarından birden çok istek sunar.
Bağlantı yöneticisi, bağlantıları rotaya göre havuzlar. Yöneticinin belirli bir yol için bağlantıları varsa, yeni bir bağlantı oluşturmak yerine havuzdan mevcut bir bağlantıyı kiralayarak bu yollarda yeni isteklere hizmet eder.
Birden çok iş parçacığından istekleri yürütmek için adımları izleyin -
Adım 1 - İstemci Bağlantı Havuzu Yöneticisinin Oluşturulması
İstemci Bağlantı Havuzu Yöneticisi'ni oluşturun. PoolingHttpClientConnectionManager sınıf.
PoolingHttpClientConnectionManager connManager = new
PoolingHttpClientConnectionManager();
Adım 2 - Maksimum bağlantı sayısını ayarlayın
Havuzdaki maksimum bağlantı sayısını ayarlayın. setMaxTotal() yöntem.
//Set the maximum number of connections in the pool
connManager.setMaxTotal(100);
Adım 3 - ClientBuilder Nesnesi Oluşturun
Oluşturmak ClientBuilder Bağlantı yöneticisini kullanarak nesneyi setConnectionManager() aşağıda gösterildiği gibi yöntem -
HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);
Adım 4 - HttpGet istek nesnelerini oluşturun
İstenen URI'yi yapıcısına parametre olarak ileterek HttpGet sınıfını örnekleyin.
HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . .
Adım 5 - Çalıştırma yönteminin uygulanması
Bir sınıf oluşturduğunuzdan, onu bir iş parçacığı haline getirdiğinizden (iş parçacığı sınıfını genişleterek veya Runnable arabirimini uygulayarak) ve run yöntemini uyguladığınızdan emin olun.
public class ClientMultiThreaded extends Thread {
public void run() {
//Run method implementation . . . . . . . . . .
}
}
Adım 6 - Konu nesneleri oluşturun
Yukarıda oluşturulan Thread sınıfını (ClientMultiThreaded) somutlaştırarak iş parçacığı nesneleri oluşturun.
Bir HttpClient nesnesi, ilgili HttpGet nesnesi ve kimliği temsil eden bir tamsayı bu iş parçacıkları için iletin.
ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adım 7 - Başlayın ve konuları birleştirin
Kullanarak tüm konuları başlatın start() yöntemi ve birleştirmeyi kullanarak onlara katılın method().
thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .
Adım 8 - Yöntem uygulamasını çalıştırın
Çalıştırma yöntemi içinde, isteği yürütün, yanıtı alın ve sonuçları yazdırın.
Misal
Aşağıdaki örnek, HTTP isteklerinin aynı anda birden çok iş parçacığından yürütülmesini gösterir. Bu örnekte, çeşitli iş parçacıklarından çeşitli istekleri yerine getirmeye ve durumu ve her istemci tarafından okunan bayt sayısını yazdırmaya çalışıyoruz.
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();
}
}
Çıktı
Yürütüldüğünde, yukarıdaki program aşağıdaki çıktıyı üretir -
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