在 Spring WebFlux 和 Project Reactor 中,onErrorStop 是一个专门配合 onErrorContinue 使用的辅助算子。它的主要作用是通过划定边界,防止 onErrorContinue 的"继续"行为向上游无限蔓延。
以下是 onErrorStop 的核心作用与使用场景:
- 核心作用:建立错误隔离墙
onErrorContinue 具有"上溯性",它会改变其位置以上所有算子的默认错误行为。如果你在流的末端使用 onErrorContinue,上游任何一个兼容的算子(如 flatMap)报错时都会尝试跳过。
onErrorStop 的介入 :
当你在某个位置加入 onErrorStop 时,它会截断下游 onErrorContinue 对更上游算子的影响。在该算子之前发生的错误将恢复为"终止流"的默认行为。
- 典型使用场景:保护局部恢复逻辑
如果你希望在 flatMap 内部通过 onErrorResume 实现特定的错误恢复,但下游又存在全局的 onErrorContinue,这时 onErrorContinue 可能会抢先捕获错误,导致你的 onErrorResume 失效。
- 问题 :
onErrorContinue会拦截上游所有的异常,即使你已经写了onErrorResume。 - 解决 :在局部处理逻辑后链式调用
onErrorStop,强制让当前的错误处理逻辑生效,并阻止下游的"继续"指令向上渗透。
-
代码对比示例
// 情况 A:没有 onErrorStop,onErrorContinue 会导致全局跳过
Flux.just(1, 2, 0, 4)
.flatMap(i -> Mono.just(i).map(v -> 100 / v)) // 0 会报错
.onErrorResume(e -> Mono.just(-1)) // 开发者本意是遇到错误返回 -1
.onErrorContinue((e, v) -> log.error("Error")) // 全局继续逻辑
.subscribe(System.out::println);
// 结果:会打印 100, 50, (报错), 25。onErrorResume 被跳过了。// 情况 B:使用 onErrorStop 保护局部逻辑
Flux.just(1, 2, 0, 4)
.flatMap(i ->
Mono.just(i)
.map(v -> 100 / v)
.onErrorResume(e -> Mono.just(-1)) // 局部恢复
.onErrorStop() // 告诉下游:这里的错误我处理完了,别再往上找了
)
.onErrorContinue((e, v) -> log.error("Global error"))
.subscribe(System.out::println);
// 结果:会打印 100, 50, -1, 25。局部恢复逻辑成功生效。
总结
| 算子 | 功能定位 |
|---|---|
| onErrorContinue | 让流在遇到错误时不终止,跳过该元素继续处理。 |
| onErrorStop | 截断信号 。确保在该点之前的错误处理逻辑(如 onErrorResume)按预期执行,不被下游的 onErrorContinue 覆盖。 |