使用apache HttpClient的有效方法

时间:2016-12-27 14:39:28

标签: performance apache-httpclient-4.x

我正在编写一个多线程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 

我读过,为了管理http连接,我应该使用连接管理器。我在客户端的4.5版本,我应该使用哪个连接管理器?连接管理器如何确保连接不泄漏并有效使用?

我尝试了以下实现:

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

client.getConnectionManager().shutdown();

但我不确定如何在池中管理连接,对于多线程系统,是否在每个线程中初始化连接管理器?

1 个答案:

答案 0 :(得分:0)

在大多数情况下,连接池应该是共享池,可由所有httpClient实例访问。

创建httpClient时,

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

这将释放连接回池,

EntityUtils.consume(httpResponse.getEntity());

虽然会关闭连接,

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

由于我们setConnectionManagerShared(true)httpClient.close()不会分流连接池。