如何在rxjava中重试时使用RetryAfter Header

问题描述 投票:0回答:1

有异常时,我有以下重试代码

.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() 
{
                    @Override
                    public Observable<?> call(Observable<? extends Throwable> observable) {
                        return observable.zipWith(retryRange, new Func2<Throwable, Integer, Object>() {
                            @Override
                            public Object call(@Track Throwable throwable, Integer retryCount) {
                                return retryCount;
                            }
                        });
                    }
            })

如果在retryRange之前有异常,此代码将继续重试api调用。

我需要在这里添加一个检查来获取errorCode,如果是503,那么我需要检查标题值“retryAfter”并使用该时间来延迟重试。我不知道如何在上面重试时得到标题,并使用它延迟重试

android rx-java
1个回答
0
投票

以下解决方案对我有用:

  .retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
                    @Override
                    public Observable<?> call(Observable<? extends Throwable> observable) {
                        return observable.zipWith(retryRange, new Func2<Throwable, Integer, Object>() {
                            @Override
                            public Object call(@Track Throwable throwable, Integer attempt) {

                                return throwable;
                            }
                        }).flatMap((new Func1<Throwable, Observable<?>>() {
                            @Override
                            public Observable<?> call(Throwable throwable) {
                                long delayTime = 0;
                                if (throwable instanceof HttpException && ((HttpException) throwable).code() == 503) {
                                    HttpException exception = (HttpException) throwable;
                                    Response response = exception.getErrorResponse();
                                    delayTime = getDelayTime(response.headers());

                                }
                                return Observable.timer(delayTime, TimeUnit.MILLISECONDS);
                            }
                        }));
© www.soinside.com 2019 - 2024. All rights reserved.