轮询服务器以获取答案,如果n次后失败,则返回异常

时间:2019-01-21 12:27:26

标签: java rx-java rx-java2

我正在尝试使用RxJava2库创建服务器调用,该库将尝试轮询服务器以获取答案,并且如果连续3次收到异常以返回该异常

我已经建立了一个基本调用,可以从服务器获取响应

final Observable<ResponseValue> responseValueObservable = Observable
                .fromCallable((Callable) (c) -> return getDispatcher().performSubmit(submitValue);
                    }
                });

return responseValueObservable
           .retry(3)
           .subscribeOn(Schedulers.io()
           .onError((t) -> { log.error(t); Observable.timer(2, SECONDS);}
           .retryUntil(() -> { return retryIsEnabled }

因此getDispatcher().performSubmit(submitValue)返回SubmitExceptionResponseValue对象。

我需要代码重试3次,每次异常后暂停2秒钟,然后返回ResponseValue或最后一个SubmitException

2 个答案:

答案 0 :(得分:0)

使用retryWhen()运算符来自定义对错误的响应。来自Dan Lew's Blog的出色概述:

responseValueObservable
  .retryWhen( errorObservable -> errorObservable
               .zipWith(Observable.range(1, 3), (n, i) -> i)
               .flatMap(retryCount -> Observable.timer(2, TimeUnit.SECONDS)))
  ...

答案 1 :(得分:0)

因此,从上一个答案中读完Dan Lew's Blog后,我便可以将这段代码组合在一起,正是我想要的。等待2秒后,retryWhen()会自动重新订阅。从服务器第一次成功答复后,它停止了。

      Observable.fromCallable((d::performSubmit))
            .subscribeOn(Schedulers.io())
            .doOnSubscribe(subscription -> System.out.println("Subscribing"))
            .retryWhen(errors -> {
                AtomicInteger counter = new AtomicInteger();
                return errors
                        .takeWhile(e -> counter.incrementAndGet() < 3)
                        .flatMap(e -> {
                            System.out.println("delay retry by 2 second(s)");
                            return Observable.timer(2, TimeUnit.SECONDS);
                        });
            }).blockingSubscribe(res -> result = Optional.of(res), throwable -> t = Optional.of((Exception) throwable));