You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断OkHttp Client连接是否已重试或处于重试状态?

判断OkHttp连接重试状态的方法

如果你已经开启了OkHttp的setRetryOnConnectionFailure(true),可以通过以下几种方式判断连接是否处于重试中或已完成重试:

1. 自定义拦截器追踪重试次数

OkHttp的重试会重新发起请求,你可以在自定义拦截器中给每个请求添加重试计数,以此判断当前请求是否属于重试:

public class RetryTrackingInterceptor implements Interceptor {
    private final AtomicInteger retryCount = new AtomicInteger(0);

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        // 获取当前重试次数
        int currentRetry = retryCount.getAndIncrement();
        if (currentRetry > 0) {
            // 当前处于重试状态
            System.out.println("正在进行第" + currentRetry + "次重试");
        }

        Response response = chain.proceed(request);
        
        // 根据请求结果重置计数
        if (!response.isSuccessful()) {
            retryCount.set(0);
        } else {
            if (currentRetry > 0) {
                System.out.println("重试完成,共重试" + currentRetry + "次");
            }
            retryCount.set(0);
        }
        return response;
    }
}

将拦截器添加到OkHttpClient中:

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new RetryTrackingInterceptor())
    .retryOnConnectionFailure(true)
    .build();

2. 扩展RetryAndFollowUpInterceptor监听重试逻辑

OkHttp的重试核心逻辑在RetryAndFollowUpInterceptor中,你可以继承这个类并重写retry方法,在重试前后添加状态通知:

public class TrackingRetryInterceptor extends RetryAndFollowUpInterceptor {
    public TrackingRetryInterceptor(OkHttpClient client) {
        super(client);
    }

    @Override
    protected boolean retry(IOException e, int retryCount, Request request, Route route, Call call) {
        // 重试前触发,标记进入重试状态
        System.out.println("开始第" + (retryCount + 1) + "次重试");
        boolean shouldRetry = super.retry(e, retryCount, request, route, call);
        if (!shouldRetry) {
            // 重试结束,不再重试
            System.out.println("重试结束,共尝试" + (retryCount + 1) + "次");
        }
        return shouldRetry;
    }
}

之后替换OkHttpClient默认的RetryAndFollowUpInterceptor(注意不同OkHttp版本的兼容性,部分版本可能需要通过反射修改拦截器列表)。

3. 利用EventListener监听请求生命周期

通过OkHttp的EventListener监听请求的启动、失败、完成等事件,结合事件序列判断重试状态:

public class RetryEventListener extends EventListener {
    private int callCount = 0;
    private boolean hasFailedConnection = false;

    @Override
    public void callStart(Call call) {
        callCount++;
        if (callCount > 1 && hasFailedConnection) {
            System.out.println("正在进行重试");
        }
        hasFailedConnection = false;
    }

    @Override
    public void connectionFailed(Call call, IOException ioe) {
        hasFailedConnection = true;
    }

    @Override
    public void callEnd(Call call) {
        if (callCount > 1) {
            System.out.println("重试已完成");
        }
        callCount = 0;
    }
}

在构建OkHttpClient时添加该EventListener:

OkHttpClient client = new OkHttpClient.Builder()
    .eventListener(new RetryEventListener())
    .retryOnConnectionFailure(true)
    .build();

你提到的单元测试和故障模拟方案,可以配合上面的方法验证:比如用故障模拟工具返回连接错误或5xx状态码,通过自定义拦截器或EventListener的输出,就能直观看到重试的状态变化。

内容的提问来源于stack exchange,提问作者surya saputra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:36:23