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




Используйте оператор 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));
Вы пробовали смотреть на это? stackoverflow.com/questions/22066481/…