RetryInterceptor.java 源代码


package activity.cloud.re;

import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

public class RetryInterceptor implements Interceptor {
    private static int maxRetry = 2;

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        RetryWrapper proceed = proceed(chain);
        while (proceed.isNeedReTry()) {
            proceed.retryNum++;
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            proceed(chain, proceed.request, proceed);
        }
        return proceed.response == null ? chain.proceed(chain.request()) : proceed.response;
    }

    private RetryWrapper proceed(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        RetryWrapper retryWrapper = new RetryWrapper(request, maxRetry);
        proceed(chain, request, retryWrapper);
        return retryWrapper;
    }

    private void proceed(Interceptor.Chain chain, Request request, RetryWrapper retryWrapper) throws IOException {
        try {
            retryWrapper.setResponse(chain.proceed(request));
        } catch (SocketException | SocketTimeoutException unused) {
        }
    }

    public static class RetryWrapper {
        private int maxRetry;
        Request request;
        Response response;
        volatile int retryNum = 0;

        RetryWrapper(Request request, int i) {
            this.request = request;
            this.maxRetry = i;
        }

        public void setResponse(Response response) {
            this.response = response;
        }

        Response response() {
            return this.response;
        }

        Request request() {
            return this.request;
        }

        boolean isSuccessful() {
            Response response = this.response;
            return response != null && response.isSuccessful();
        }

        boolean isNeedReTry() {
            return !isSuccessful() && this.retryNum < this.maxRetry;
        }

        public void setRetryNum(int i) {
            this.retryNum = i;
        }

        public void setMaxRetry(int i) {
            this.maxRetry = i;
        }
    }
}