//设置请求超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(2000)
.setConnectionRequestTimeout(2000)
.setSocketTimeout(2000)
.build();
说明
ConnectionRequestTimeout
httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池
ConnectTimeout
连接建立时间,三次握手完成时间
SocketTimeout
数据传输过程中数据包之间间隔的最大时间
下面重点说下SocketTimeout,比如有如下图所示的http请求
虽然报文(“abc”)返回总共用了6秒,如果SocketTimeout设置成4秒,实际程序执行的时候是不会抛出java.net.SocketTimeoutException: Read timed out异常的。
因为SocketTimeout的值表示的是“a”、”b”、”c”这三个报文,每两个相邻的报文的间隔时间不能超过SocketTimeout。
---------------------
Tips:
HttpClient 一般使用 PoolingHttpClientConnectionManager 实现池化技术,而 BasicHttpClientConnectionManager是单线程的,没有使用到池化技术。池化技术中两个比较关键的参数就是 maxTotal 和 maxPerRoute。
maxTotal 是设置同时间正在使用的最大连接数,默认值是20。
maxPerRoute 是设置一个 host(ip或域名):port 同时间正在使用的最大连接数,默认值是2。
maxTotal 是连接池中可用的总最大连接数。maxPerRoute 是限制到单个端口或url的连接总数(同路由并发数)。 maxConnPerRoute * 路由数量 不会大于 maxConnTotal 设置过小无法支持大并发(ConnectionPoolTimeoutException: Timeout waiting for connection from pool)
原文:ConnectTimeout、ConnectionRequestTimeout、SocketTimeout的含义_编程录的博客-CSDN博客HttpClient中的maxTotal和maxPerRoute区别_jefferson-chern的博客-CSDN博客
版权声明:本文为博主原创文章,转载请附上博文链接!