这里主要介绍HttpClient 4.5版本(区别于HttpClient 4.3 版本,参数又说不同)设置连接超时时间CloseableHttpClient。
超时的情况有三种:
(1)从连接池中获取可用连接超时(单位:毫秒)
HttpClient中的要用到连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用的连接(比如连接池中没有空闲连接了),则会抛出获取连接超时异常。
(2)连接目标超时connectionTimeout(单位:毫秒)
指的是连接目标url的连接超时时间,即客户端发送请求到与目标url建立连接的最大时间。如果在该时间范围内还没有建立起连接,则就抛出connectionTimeout异常。
如:可以通过测试一个不存在的url,进行连接,则会抛出异常。
(3)等待响应超时(读取数据超时) socketTimeout (单位:毫秒)
即在于目标url建立连接后,等待返回response,在规定时间内没有返回响应数据的话就抛出SocketTimeOut。
超时连接代码示例:
public class TestHttpClient {
public static void main(String[] args) throws IOException {
final int MAX_CONN_TOTAL = 10; // 连接池中的最大连接数
final int MAX_CONN_PER_ROUTE = 10; // 连接同一个route最大的并发数
final int CONNECT_REQUEST_TIMEOUT = 100; // 从连接池中获取可用连接最大超时时间 单位:毫秒
final int CONNECT_TIMEOUT = 100; // 连接目标url最大超时 单位:毫秒
final int SOCKET_TIMEOUT = 100; // 等待响应(读数据)最大超时 单位:毫秒
final String TEST_URL = "http://www.baidu.com"; // 存在的一个url
final String TEST_URL_2 = "http://www.dddddddd.com"; // 不存在的url
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(CONNECT_REQUEST_TIMEOUT) // 单位为毫秒
.setConnectTimeout(CONNECT_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.build();
HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(MAX_CONN_TOTAL) // 连接池中的最大连接数
.setMaxConnPerRoute(MAX_CONN_PER_ROUTE) // 分配给同一个route最大的并发数
.setDefaultRequestConfig(requestConfig)
.build();
HttpPost httpPost = new HttpPost(TEST_URL_2);
HttpEntity entity = httpClient.execute(httpPost).getEntity();
InputStream inputStream = null;
String body = "";
if (entity != null ){
inputStream = entity.getContent();
// 转换为字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String line = "";
while ((line = br.readLine()) != null ) {
body += line;
}
}
System.out.println(body);
}
}
补充知识点(另外两个HttpClient的参数设置):
(1)连接池中最大连接数 maxConnTotal
(2)单个路由最大连接数 maxConnPerRoute
路由(route):运行环境机器到目标机器的一条线路。单个路由最大连接数,即分配给同一个路由(route)最大的并发连接数。举例来说,我们使用HttpClient的实现来分别请求
www.baidu.com和
www.bing.com的资源,那么会产生两个路由route。