HttpComponents 之客户端连接池

    xiaoxiao2025-12-14  2

    1.配置参数

    org.apache.http.impl.conn.PoolingHttpClientConnectionManager

    类。用于管理httpClient连接池。调用默认构造函数即可得到。

    org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setMaxTotal(int max)

    设置最大的连接数,即tcp连接数。

     void org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setDefaultMaxPerRoute(int max)

    设置每个路由的默认最大连接数。默认为2。也就是说你连qq.com:80的tcp个数最多为2。

    void org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setMaxPerRoute(HttpRoute route, int max)

    设置指定路由的最大连接数。

    2.拿到httpClient

    HttpClientBuilder org.apache.http.impl.client.HttpClients.custom()

    拿到HttpClientBuilder 。

    HttpClientBuilder org.apache.http.impl.client.HttpClientBuilder.setConnectionManager(HttpClientConnectionManager connManager)

    将PoolingHttpClientConnectionManager对象传进去。注意返回类型,可链式调用。

    HttpClientBuilder org.apache.http.impl.client.HttpClientBuilder.setDefaultRequestConfig(RequestConfig config)

    将RequestConfig对象传进去。

    CloseableHttpClient org.apache.http.impl.client.HttpClientBuilder.build()

    至此拿到了httpClient对象。它是线程安全的。

    3.示例代码

    也可见yichuutil项目。

    4.回收过期链接

    服务端若资源紧张,可能关闭一些我们已经建立好的链接。而连接池自己不会关,所以需要一个定时任务来清理。PoolingHttpClientConnectionManager类已经提供了此方法。 void org.apache.http.impl.conn.PoolingHttpClientConnectionManager. closeExpiredConnections()

    图4-1 官网相关介绍,清理过期链接

    5.注意

    调用CloseableHttpResponse org.apache.http.impl.client.CloseableHttpClient. execute(HttpUriRequest request)时,会从连接池中找出一条链接通路来通信,此方法仍是同步的。所以要想做到并发通信,数据库连接池必须配合多线程使用。
    最新回复(0)