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

  • 相关阅读:
    【Java成王之路】EE初阶第十九篇: 前端三剑客 HTML基础篇2
    Week 1 Introduction to NLP and Language Modelling
    RxJava入门
    Docker数据管理
    Java SE 14 新增特性
    Javaweb03-servlet&filter
    R3LIVE论文学习(二):VIO子系统
    使用springdoc-openapi-starter-webmvc-ui后访问swagger-ui/index.html 报错404
    Gogs安装和部署教程-centos上
    【软考】-- 操作系统(中)
  • 原文地址:https://blog.csdn.net/chi_666/article/details/140350014