【发布时间】:2020-09-24 04:51:06
【问题描述】:
当多个onErrorContinue 添加到管道以处理从flatMap 抛出的特定类型的异常时,异常处理无法按预期工作。
下面的代码,我希望,元素 1 到 6 应该被删除,元素 7 到 10 应该被订阅者消费。
public class FlatMapOnErrorContinueExample {
public static void main(String[] args) {
Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.flatMap(number -> {
if (number <= 3) {
return Mono.error(new NumberLesserThanThree("Number is lesser than 3"));
} else if (number > 3 && number <= 6) {
return Mono.error(new NumberLesserThanSixButGretherThan3("Number is grether than 6"));
} else {
return Mono.just(number);
}
})
.onErrorContinue(NumberLesserThanThree.class,
(throwable, object) -> System.err.println("Exception: Dropping the element because it is lesser than 3"))
.onErrorContinue(NumberLesserThanSixButGretherThan3.class,
(throwable, object) -> System.err.println("Exception: Dropping the element because it is lesser than 6 but grether than 3"))
.onErrorContinue((throwable, object) ->
System.err.println("Exception: " + throwable.getMessage()))
.subscribe(number -> System.out.println("number is " + number),
error -> System.err.println("Exception in Subscription " + error.getMessage()));
}
public static class NumberLesserThanThree extends RuntimeException {
public NumberLesserThanThree(final String msg) {
super(msg);
}
}
public static class NumberLesserThanSixButGretherThan3 extends RuntimeException {
public NumberLesserThanSixButGretherThan3(final String msg) {
super(msg);
}
}
}
这是我得到的输出:
Exception: Dropping the element because it is lesser than 3
Exception: Dropping the element because it is lesser than 3
Exception: Dropping the element because it is lesser than 3
Exception in Subscription Number is grether than 6
问题:为什么没有调用第二个onErrorContinue,而是将异常发送给订阅者?
补充说明:
如果我删除第一个和第二个onErrorContinue,那么所有异常都由第三个onErrorContinue 处理。我可以使用这种方法来接收所有异常并检查异常类型并继续处理。但是,我想让它更清晰的异常处理,而不是添加 if..else 块。
这个问题与Why does Thread.sleep() trigger the subscription to Flux.interval()?有何不同
1)关于异常处理和异常处理顺序的这个问题;另一个问题是关于并行处理元素并使主线程等待所有元素处理完成
3)这个问题对线程没有任何关注,即使在. subscribe之后添加Thread.sleep(10000),行为也没有变化。
【问题讨论】:
标签: project-reactor spring-reactor