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 覆盖。
相关推荐
覆东流5 小时前
7.Java数组
java·开发语言·后端
m0_719084115 小时前
限流和获取请求ip的方法
java
lzhdim5 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
深漂的华哥6 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
落魄大学生之流水线上谋生计7 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
爱学习的小白柏8 小时前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
码匠许师傅8 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
沙盘客9 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
CHANCE V9 小时前
集合排序和流排序
java
16月6日-晴9 小时前
Java面向对象进阶—多态
java·开发语言