Опросив сервер на ответ, верните исключение, если произошел сбой после n раз - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь создать серверный вызов, используя библиотеку 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) возвращает либо SubmitException, либо ResponseValue объект.

Мне нужен код, чтобы повторить 3 раза, делая паузу после каждого исключения на 2 секунды и возвращая либо ResponseValue, либо последний SubmitException

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Итак, прочитав Блог Дэна Лью из предыдущего ответа, я смог собрать этот фрагмент кода, который выполняет именно то, что я хотел. retryWhen() при повторной подписке автоматически через 2 секунды ожидания. При первом успешном ответе с сервера он останавливается.

      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));
0 голосов
/ 21 января 2019

Используйте оператор retryWhen() для настройки ответа на ошибки.Из превосходного обзора в Блог Дэна Лью :

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