• 调用第三方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接口到抛出异常的时间差来进行判断,因为默认配置的响应超时时间是从连接成功开始计算的。因此日志里面的时间差其实等于 连接超时时间 +响应超时时间
    在这里插入图片描述

  • 相关阅读:
    PS-滤镜
    C语言加密字符(ZZULIOJ1064:加密字符)
    杭州亚运会实现核心系统100%上云、云上转播7200+小时
    【数据结构与算法】二叉树的知识讲解
    Kubernetes(k8s)的Pod控制器介绍和ReplicaSet控制器详细讲解
    go中context初始使用
    PHP---网站的基本概念
    Linux-Stream内存带宽及MLC内存延迟性能测试方法
    SpringBoot高频面试题
    问题汇总20231110
  • 原文地址:https://blog.csdn.net/chi_666/article/details/140350014