Webflux onErrorStop使用

在 Spring WebFlux 和 Project Reactor 中,onErrorStop 是一个专门配合 onErrorContinue 使用的辅助算子。它的主要作用是通过划定边界,防止 onErrorContinue 的"继续"行为向上游无限蔓延

以下是 onErrorStop 的核心作用与使用场景:

  1. 核心作用:建立错误隔离墙

onErrorContinue 具有"上溯性",它会改变其位置以上所有算子的默认错误行为。如果你在流的末端使用 onErrorContinue,上游任何一个兼容的算子(如 flatMap)报错时都会尝试跳过。

onErrorStop 的介入

当你在某个位置加入 onErrorStop 时,它会截断下游 onErrorContinue 对更上游算子的影响。在该算子之前发生的错误将恢复为"终止流"的默认行为。

  1. 典型使用场景:保护局部恢复逻辑

如果你希望在 flatMap 内部通过 onErrorResume 实现特定的错误恢复,但下游又存在全局的 onErrorContinue,这时 onErrorContinue 可能会抢先捕获错误,导致你的 onErrorResume 失效。

  • 问题onErrorContinue 会拦截上游所有的异常,即使你已经写了 onErrorResume
  • 解决 :在局部处理逻辑后链式调用 onErrorStop,强制让当前的错误处理逻辑生效,并阻止下游的"继续"指令向上渗透。
  1. 代码对比示例

    // 情况 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 覆盖。
相关推荐
橙淮4 小时前
并发编程(六)
java·jvm
拽着尾巴的鱼儿4 小时前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
白露与泡影4 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
EntyIU5 小时前
JVM内存与GC笔记
java·jvm·笔记
XS0301065 小时前
并发编程 六
java·后端
yaoxin5211235 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
雪宫街道5 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
x***r1515 小时前
linux安装 jdk-8u291-linux-x64.tar.gz 详细步骤(解压配置环境变量)
java
极光代码工作室6 小时前
基于SpringBoot的校园论坛系统
java·springboot·web开发·后端开发
XS0301066 小时前
Spring Bean 作用域 & 生命周期
java·后端·spring