Опрос сервера для ответа, возврат исключения, если происходит сбой после n раз

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

Вы пробовали смотреть на это? stackoverflow.com/questions/22066481/…

Joshua de Guzman 22.01.2019 12:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
77
2

Ответы 2

Используйте оператор retryWhen(), чтобы настроить реакцию на ошибки. Из отличного обзора на Блог Дэна Лью:

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

Итак, прочитав Блог Дэна Лью из предыдущего ответа, я смог собрать этот фрагмент кода, который делает именно то, что я хотел. retryWhen() on повторно подписывается автоматически через 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));

Другие вопросы по теме