Efficient way of using apache HttpClient

2.3k Views Asked by At

I am writing a multi-threaded REST client that uses different APIs for different purposes, For making these requests I am using an HttpClient with its different methods (GET,PUT,POST)

Thread 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
}

Thread 2:

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

I read that for managing httpConnections I should using a Connection Manager. I am on version 4.5 of the client, which connection manager should I be using? How does the connection manager ensure connections dont leak and are used efficiently?

I tried the following implementation :

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

client.getConnectionManager().shutdown();

But I am not sure how connections are managed in the pool , for a multithreaded system, does the connection manager be initialized in every thread?

1

There are 1 best solutions below

0
On

In most cases, connection pool should be a shared one, accessible by all httpClient instances.

When creating httpClient,

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

And this will release the connection back to the pool,

EntityUtils.consume(httpResponse.getEntity());

While will close the connection,

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

Since we have setConnectionManagerShared(true), httpClient.close() wouldn't shunt down the connection pool.