如何判断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
相关产品推荐
相关产品推荐

