Single.retry (3) вызывается только один раз - PullRequest
0 голосов
/ 29 марта 2019

У меня есть три вызова API, требования:

  1. Второй API и третий API должны вызываться только при успешном выполнении первого.
  2. Когда первый API вызывает исключение,Повторите этот вызов
  3. Когда первый API-интерфейс завершится неудачно 3 раза, прекратите повторную попытку и передайте Исключение подписчику
  4. Когда первый успешно, но второй API-интерфейс не удается, возобновите со значением по умолчанию для второгоAPI

Используя код, который выглядит ниже, первый API вообще не повторяется

public static void main(String[] args) {
    Single.zip(
            getA().retry(3),
            getB().onErrorResumeNext(Single.just("defaultB")),
            getC(),
            (a, b, c) -> a)
            .subscribe(a -> {
                System.out.println(a);
            }, error -> {
                System.out.println(error.getMessage());
            });

}

private static Single<String> getA() {
    System.out.println("getA()");
    return Single.error(new Exception("a"));
}

private static Single<String> getB() {
    System.out.println("getB()");
    return Single.error(new Exception("b"));
}

private static Single<String> getC() {
    System.out.println("getB()");
    return Single.error(new Exception("b"));
}

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Я почти уверен, что Single повторяется, но вызов getA() не выполняется, поскольку он не является частью цепочки RxJava.Вы вызываете его один раз, и, таким образом, распечатка происходит только один раз.

Чтобы увидеть повторную попытку полностью, оберните содержимое метода в defer:

private static Single<String> getA() {
    return Single.defer(() -> {
        System.out.println("getA()");
        return Single.error(new Exception("a"));
    });
}

Также, если ваши требованияпроизнесите A, а затем B + C вместе, поэтому следующая последовательность более уместна:

getA().retry(3)
.flatMap(a -> Single.zip(
    getB().onErrorResumeNext(Single.just("defaultB")), 
    getC(),
    (b, c) -> a
))
.subscribe(a -> {
            System.out.println(a);
        }, error -> {
            System.out.println(error.getMessage());
        });
0 голосов
/ 29 марта 2019

Почтовый индекс неверен, если ваши звонки зависимы, как примерно так:

Single.just("input")
  .flatMap(a -> getA()).retry(3)
  .flatMap(a -> getB()).onErrorResumeNext(Single.just("defaultB"))
  .flatMap(b -> getC())
  .subscribe(a -> {
    System.out.println(a);
  }, error -> {
    System.err.println(error.getMessage());
  });
...