HttpClient 超时相关参数设置

本文深入探讨了HttpClient的超时设置,包括连接超时、读取超时和发送超时。通过代码示例详细解释了如何配置这些参数,以确保网络请求的稳定性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里主要介绍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.comwww.bing.com的资源,那么会产生两个路由route。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值