请考虑以下测试:
@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,强制客户端尝试捕获所有异常也很不方便。
处理此类情况的最佳策略是什么?
答案 0 :(得分:0)
在此示例中,默认情况下,传递给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();
}