在以前文章里我们分别介绍了 httpclient 连接池的连接的申请,连接的释放,连接的重用,连接的 keep alive ,连接的可用性检查,空闲连接的清理,请求的 retry ,ssl 请求的支持,长连接的支持等。在这里我们主要总结连接池中的使用建议。
对于 httpclient 连接池使用一般考虑以下几点:
我们通过如下代码设置上述 items :
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(10000)//设置连接池申请连接的超时时间,默认-1为无限时间
.setConnectTimeout(5000)//设置socket进行3次握手建立连接的超时时间
.setSocketTimeout(8000)//设置连接超时时间,即socket读写超时时间
.setMaxRedirects(50)//设置最大的redirect次数,默认为50
.setStaleConnectionCheckEnabled(Boolean.TRUE)//设置开启可用性检查,默认不开启
.build();
CloseableHttpClient htttpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setMaxConnPerRoute(50)//设置individual route连接池中最大的连接数,默认为2
.setMaxConnTotal(500)//设置global连接池中最大的连接数,默认为20
.setConnectionTimeToLive(-1, TimeUnit.MICROSECONDS)//设置连接池中连接存活时间,默认-1代表无限存活,连接使用之后由response header "Keep-Alive: timeout"决定。
.evictIdleConnections(60000, TimeUnit.MILLISECONDS)//开启空袭连接清理线程,设置连接池中连接最大空闲时间,以及连接清理线程的sleep时间,默认为10秒
.evictExpiredConnections()//开启过期连接清理线程,过期时间默认为-1,连接使用后由response header "Keep-Alive: timeout"决定。
//.setRetryHandler(retryHandler)//设置重试策略,默认3次重试
//.setSSLContext(sslContext)//设置ssl请求上下文
//.setSSLHostnameVerifier(hostnameVerifier)//设置ssl证书cn host name验证策略,默认为验证cn host name
.build();
如果希望重用池化对象并且保持长连接,那么务必请调用 EntityUtils 类之中的静态方法toByteArray(),toString(),consume(),consumeQuietly()等。如果不希望重用池化对象,同时也不希望使用长连接,那么请调用 CloseableHttpResponse 的close() 方法。另外我们也会经常使用 Spring 的 RestTemplate 来发送 https 请求,对于 RestTemplate 一般也是会去整合 Apache HttpComponents HttpClient 组件,所以在使用 RestTemplate 的时候也请考虑以上各个 items 的设置。