Rx java RxJava重试N次
rxjava2 我试图在rxJava中进行非常简单的重试,这将重试3次,然后导致最初的错误。以下是我现在拥有的: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
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");
}
然后,执行似乎永远受阻。所以有两个问题:
- 如何做到这一点
- 为什么它不能像现在这样工作,我应该如何调试它
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