Эффективный способ использования apache HttpClient

Я пишу многопоточный клиент REST, который использует различные API для различных целей, для выполнения этих запросов я использую HttpClient с его различными методами (GET, PUT, POST)

Поток 1:

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httpclient.execute(httppost);


methodThatNeedsHttpClient(httpclient);


public void methodThatNeedsHttpClient(HttpClient client) {
//perform other GET/POST/PUT requests
}

Поток 2:

DefaultHttpClient httpclient2 = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httpclient2.execute(httppost);
 // Other methods 

Я прочитал, что для управления httpConnections я должен использовать диспетчер соединений. I am on version 4.5 of the client, which connection manager should I be using? Как диспетчер соединений гарантирует, что соединения не протекают и используются эффективно?

Я попробовал следующую реализацию :

PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager();
        connectionManager.setMaxTotal(5);
// Perform REST operations 

client.getConnectionManager().shutdown();

Но я не уверен , как соединения управляются в пуле, для многопоточной системы, инициализируется ли диспетчер соединений в каждом потоке?

1 ответ

  1. В большинстве случаев пул соединений должен быть общим, доступным для всех экземпляров httpClient.

    При создании httpClient,

    CloseableHttpClient httpClient = HttpClients.custom()
                    .setConnectionManager(connectionManager)
                    .setConnectionManagerShared(true)
                    .build();
    

    И это освободит соединение обратно в пул,

    EntityUtils.consume(httpResponse.getEntity());
    

    While закроет соединение,

    httpResponse.close();
    httpClient.close();
    

    Так как у нас есть setConnectionManagerShared(true), httpClient.close()не будет шунтировать пул соединений.