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

  • 相关阅读:
    LeetCode【394】字符串解码
    C/C++内存管理
    Android 音视频难学?音视频(流媒体)开发学习也有套路
    银行分布式持久化存储系统方案设计
    一、VSCode——免安装
    Java --- JVM虚拟机栈
    Electron 从基础到实战笔记 - Electron App对象及其事件
    求求,别在sql里格式化数据了
    Springboot踩坑-request body重复读问题
    【树莓派 Pico 基于MicroPython编程Thonny开发】
  • 原文地址:https://blog.csdn.net/chi_666/article/details/140350014