我正在编写一个多线程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();
但我不确定如何在池中管理连接,对于多线程系统,是否在每个线程中初始化连接管理器?
答案 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()
不会分流连接池。