Rx java RxJava重试N次

Rx java RxJava重试N次,rx-java,Rx Java,rxjava2 我试图在rxJava中进行非常简单的重试,这将重试3次,然后导致最初的错误。以下是我现在拥有的: public void retry3() { Observable<Object> retry = Observable .error(new IllegalStateException()) .retryWhen(errors -> errors .zipWith(Observable.rang

rxjava2

我试图在rxJava中进行非常简单的重试,这将重试3次,然后导致最初的错误。以下是我现在拥有的:

public void retry3() {
    Observable<Object> retry = Observable
         .error(new IllegalStateException())
         .retryWhen(errors -> errors
             .zipWith(Observable.range(1, 3), (n, i) -> {
                  System.out.println("Retry: " + i);
                  return i;
             }));

    System.out.println("start");
    retry.blockingFirst();
    System.out.println("stop");
}
然后,执行似乎永远受阻。所以有两个问题:

  • 如何做到这一点
  • 为什么它不能像现在这样工作,我应该如何调试它
来自文档:

返回此可观察对象发出的第一项,或抛出 如果它不发出任何项目,则无任何TouchElementException

在您的例子中,Observable工作得很好,但是它抛出了
NoTouchElementException
,因为最终没有发出任何项。您正在重试3次,然后可观察的
结束-发送
onComplete()

如何做到这一点

您可以使用
blockingSubscribe()
,然后您的案例将按预期工作

为什么它不能像现在这样工作,我应该如何调试它


在这种情况下,您应该观察异常以知道发生了错误,您可以使用
doOnXXX()
操作符在各种通知中添加打印,以观察错误并按预期工作。

如果我理解正确,您希望最终结果是第一个错误,所以你需要以某种方式跟踪它。一个有效的解决办法是:

public void retry3(){
//这只是一些准备,以便我们能够看到结果并更好地理解它。
//基本上,这是一个可观察的结果,它将:
//-在不同的例外情况下失败
//-让我们看看那些是什么
最终随机数=新随机数();
最终可观测误差ReturningObservable=可观测
.just(0)
.flatMap(i->Observable.error(新异常(“异常”+random.nextInt()))
.doon错误(错误->系统.out.println(“发出的”+错误.getMessage());
//以下是实际的重试逻辑:
//-如果出现错误,请通过重试继续
//-如果重试结束时仍有错误,请返回原始错误
最终可观测重试可观测=错误返回可观测
.OneErrorResumeNext(错误->错误返回可观察
.重试(2)
.onErrorResumeNext(可观察到的错误)
);
系统输出打印项次(“开始”);
可观察的重试
.订阅(
result->System.out.println(“无法到达这里!”),
error->System.out.println(“最后一个错误是:”+error.getMessage())
);
系统输出打印项次(“停止”);
}
如果运行此操作,您将看到如下内容:

start
Emitted Exception 2138850329 << first emitted error
Emitted Exception 1806115610
Emitted Exception -40768559
Emitted Exception 871227422
The final error is: Exception 2138850329 << matches the one returned at the end
stop
开始

发出的异常2138850329附带说明,这种非常简单的重试的情况是开箱即用的:
。重试(3)
您是正确的。异常被抛出。我不知道我是如何设法观察到它的行为的,只是永远阻塞。现在我重试了,它确实抛出了“NoTouchElementException”,这将被排除。然而,正如我所说的,我希望返回原始异常。
start
Emitted Exception 2138850329 << first emitted error
Emitted Exception 1806115610
Emitted Exception -40768559
Emitted Exception 871227422
The final error is: Exception 2138850329 << matches the one returned at the end
stop