HttpClient的连接池
HttpClien中使用了连接池来管理持有连接,同一条TCP链路上,连接是可以复用的。HttpClient通过连接池的方式进行连接持久化。
其实“池”技术是一种通用的设计,其设计思想并不复杂:
- 当有连接第一次使用的时候建立连接
- 结束时对应连接不关闭,归还到池中
- 下次同个目的的连接可从池中获取一个可用连接
- 定期清理过期连接
代码实现
public void testPool() throws IOException {
//1.创建HttpClient连接管理器
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//2.设置参数
cm.setMaxTotal(20);//设置最大连接数
cm.setDefaultMaxPerRoute(20);//设置每个主机的最大并发
doGet(cm);
doGet(cm);
}
private void doGet(PoolingHttpClientConnectionManager cm) throws IOException {
//3.从连接池中获取HttpClient对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
//在这里加上断点观察到每次从池中获取到一个不同的HttpClient对象
//4.创建HttpGet对象
HttpGet httpGet = new HttpGet("http://www.itcast.cn/");
//5.发送请求
CloseableHttpResponse response = httpClient.execute(httpGet);
//6.获取资源
if((response.getStatusLine().getStatusCode()) == 200){
String html = EntityUtils.toString(response.getEntity(),"UTF-8");
System.out.println(html);
}
//7.关闭资源
response.close();
//httpClient.close();注意这里不要关闭HttpClient,因为使用连接池,HttpClinet对象使用完之后要还回到池中
}
以上文字内容转自
https://www.cnblogs.com/kingszelda/p/8988505.html