为什么retryWhen()不成立?

时间:2017-05-16 13:27:33

标签: java rx-java

假设我有以下代码:

retryWhen

我希望它会执行,因为Observable.error(new Throwable()). retryWhen(notificationHandler -> Observable.create(subscriber -> { log("never"); }).observeOn(Schedulers.newThread())). subscribe(x -> {}, t -> log("err"), () -> log("completed")); 永远不会重新订阅或完成。

但是当我运行它时,应用程序停止,甚至没有指示错误或竞争。

为什么它永远不会持续?

P.S。我有想法,执行中断因为它都在单线程上运行。并尝试将retryWhen()处理程序移动到另一个线程:

A=sparse(b(:,1),b(:,2),1,10,10);

但它没有帮助 - 仍打印'永不'并停止。

2 个答案:

答案 0 :(得分:0)

请通过以下链接查看Dan的解释:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/

确实说

  

让我们先看看最后一部分。返回的Observable的排放确定是否发生重新订阅。如果它发出onCompleted或onError,那么它不会重新订阅。但是如果它发出onNext则会发生(不管onNext中的实际内容是什么)。

重试当订阅Observable.never()时,它不提供任何值。因此,管道处于停滞状态,您的申请将不会继续。您可以抛出e on / error或on值:

让我们来看看这个测试。它表明不会发出任何值,也不会重新订阅。

@Test
void name2() throws Exception {
    boolean await = Observable.error(new Throwable())
            .doOnEach(objectNotification -> System.out.println("x"))
            .retryWhen(notificationHandler -> Observable.never())
            .map(o -> -42)
            .doOnNext(System.out::println)
            .test()
            .await(100, TimeUnit.MILLISECONDS);

    assertThat(await).isFalse();
}
  

我希望,它会持续执行,因为重试时永远不会重新订阅或完成。但是当我运行它时,应用程序停止,甚至没有指示错误或竞争。

应用程序没有指明任何内容,因为从未到达订阅onComplete / onError,因为Observable.never()。

答案 1 :(得分:0)

首先,我认为您对Observable.neverObservable.empty感到困惑。当您使用Observable.never时,它不会重试(notificationHandler已消耗错误)。

其次,当您使用retryWhen时,您应该订阅给定的notificationHandler。或者它会在订阅时立即重试(订阅时将调用参数Func1<> notificationHandler,并在返回Observable emit项时重试)。