• 调用第三方API超时如何区分是连接超时还是响应超时


    在Java中调用第三方接口时,遇到超时问题通常涉及两种类型的超时:连接超时(Connect Timeout)和响应超时(Read TimeOut)
    要查看是对方响应超时还是自己方连接超时,可以通过设置Java的HttpClient的超时时间和捕获异常来判断。以下是一个示例:

    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.CoreConnectionPNames;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    
    public class TimeoutTest {
        public static void main(String[] args) {
            // 设置连接超时时间,单位毫秒
            int connectionTimeout = 5000;
            // 设置读取数据超时时间,单位毫秒
            int socketTimeout = 10000;
    
            // 创建HttpClientBuilder
            HttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout);
            HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
            RequestConfig requestConfig = RequestConfig.custom().setParams(httpParams).build();
    
            try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
                HttpGet httpGet = new HttpGet("http://example.com");
                httpGet.setConfig(requestConfig);
    
                try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                    // 处理响应
                }
            } catch (org.apache.http.conn.ConnectTimeoutException e) {
                System.out.println("连接超时");
            } catch (org.apache.http.socket.TimeoutException e) {
                System.out.println("响应超时");
            } catch (Exception e) {
                System.out.println("其他异常: " + e.getMessage());
            }
        }
    }
    

    在这个示例中,我们设置了连接超时时间为5秒,读取数据超时时间为10秒。通过捕获org.apache.http.conn.ConnectTimeoutExceptionorg.apache.http.socket.TimeoutException异常,可以判断是连接超时还是响应超时。针对于一些框架包装后的异常若无法区分具体超时异常类型就需要从日志中详细查看是否有read读取关键信息或connect连接关键信息。
    在这里插入图片描述
    不能简单的根据同一个线程调用API接口到抛出异常的时间差来进行判断,因为默认配置的响应超时时间是从连接成功开始计算的。因此日志里面的时间差其实等于 连接超时时间 +响应超时时间
    在这里插入图片描述

  • 相关阅读:
    [Redis] Redis穿透、雪崩和击穿
    【Web3 系列开发教程——创建你的第一个 NFT(9)】如何在手机钱包里查看你的 NFT
    APK 签名 v1 v2 步骤
    生成指定位数的随机验证码
    springboot昆明学院档案管理系统毕业设计源码311758
    异构计算技术分析
    只问耕耘,不问收获,其实收获却在耕耘中
    Vue3 - style v-bind 动态样式(详细使用教程)
    uni-app:点击图片进行图片旋转(可自定义旋转次数)
    VUE+Spring前后台传值的坑,后台接收的String参数在末尾会出现 “=”
  • 原文地址:https://blog.csdn.net/chi_666/article/details/140350014