繁体   English   中英

如何处理Project Reactor中处理器订阅中抛出的异常

[英]How to handle exceptions thrown in subscriptions to processors in Project Reactor

考虑以下测试:

@Test
void test() {
    DirectProcessor<Object> objectTopicProcessor = DirectProcessor.create();

    Runnable r = mock(Runnable.class);

    objectTopicProcessor.subscribe(next -> {throw new RuntimeException("eee");});
    objectTopicProcessor.subscribe(next -> r.run());

    assertThrows(RuntimeException.class, () -> objectTopicProcessor.onNext("")); // exception is thrown

    verify(r).run(); // it's not run
}

想象一下,我构建了一个API,我将处理器暴露给客户端。 当某人有多个订阅且其中一个抛出异常时,其他调用不会被执行。 此外,异常从objectTopicProcessor.onNext("")传播并抛出。 我想防止这种行为。

我知道客户端可以将其代码包装在try-catch内部订阅中,但还有其他方法吗? 有时,例如,NullPointer可能会发生,或者客户端可能忘记检查异常。 对于API,强制客户端尝试捕获所有异常也是不方便的。

处理此类案件的最佳策略是什么?

在此示例中,传递给subscribe方法的代码默认在主线程上执行。 它首先遇到异常并立即失败而不执行第二个subscribe块。
为了实现并行性,请使用.publishOn(scheduler)方法:

@Test
void test() {
    DirectProcessor<Object> processor = DirectProcessor.create();
    Flux<Object> flux = processor.publishOn(Schedulers.parallel());
    Runnable r = mock(Runnable.class);
    flux.subscribe(next -> {throw new RuntimeException("eee");});
    flux.subscribe(next -> r.run());

    processor.onNext(""); // onNext no longer throws an exception

    verify(r, timeout(1000)).run();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM