单声道异步异常处理

时间:2017-06-08 18:57:39

标签: java project-reactor

我只想弄清楚异常处理在reactor库中是如何工作的。

考虑以下示例:

public class FluxTest {

@Test
public void testIt() throws InterruptedException {
    Scheduler single = Schedulers.single();

    CountDownLatch latch = new CountDownLatch(1);

    Mono.just("hey")
            .subscribeOn(single)
            .doOnError(e -> System.out.println("ERROR1: " + e.getMessage()))
            .doOnTerminate((r, e) -> {
                if (e != null) System.out.println("ERROR3: " + e.getMessage());
                latch.countDown();
            })
            .subscribe(
                    it -> { throw new RuntimeException("Error for " + it); },
                    ex -> { System.out.println("ERROR2: " + ex.getMessage());}
                    );

    latch.await();
}

}

实际上,我无法看到任何错误处理代码块的执行。 测试终止,没有任何消息。此外,我试图删除doOnError, doOnTerminate处理器,但没有运气。

1 个答案:

答案 0 :(得分:4)

在你的情况下,这是正确的行为。 你是从单个字符串创建单声道"嘿"没有错误。如果您尝试调试,则可以看到使用doOnTerminate参数调用e = null方法,根据文档,无论如何{@ 1}}或success都会调用它。

要测试一些错误处理,你可以做下一件事:

error

使用上面的代码运行测试后,您应该在控制台中使用三行​​

public class FluxTest {
    @Test
    public void testIt() throws InterruptedException {
        Scheduler single = Schedulers.single();

        CountDownLatch latch = new CountDownLatch(1);

        Mono.just("hey")
                .map(this::mapWithException)
                .subscribeOn(single)
                .doOnError(e -> System.out.println("ERROR1: " + e.getMessage()))
                .doOnTerminate((r, e) -> {
                    if (e != null) System.out.println("ERROR3: " + e.getMessage());
                    latch.countDown();
                })
                .subscribe(
                        it -> { throw new RuntimeException("Error for " + it); },
                        ex -> { System.out.println("ERROR2: " + ex.getMessage());}
                        );

        latch.await();
    }

    private String mapWithException(String s) {
        throw new RuntimeException();
    }
}

因此,当单声道失败时,第一次回叫为ERROR1: null ERROR3: null ERROR2: null ,第二次回复为onError,因为mono终止时出现错误,第三次onTerminate来自errorConsumer方法。