Single.retry(3)仅调用一次

时间:2019-03-29 09:48:47

标签: java android rx-java reactive-programming rx-java2

我有3个api调用,要求是

  1. 第二个api和第三个api仅在第一个api成功时才应调用。
  2. 当第一个api引发异常时,请重试该调用
  3. 当第一个api连续3次失败时,请停止重试并将异常传递给订阅者
  4. 当第一个API成功但第二个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 个答案:

答案 0 :(得分:1)

我很确定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());
        });

答案 1 :(得分:0)

如果您的呼叫是从属的,则邮编不正确,该怎么办?

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());
  });