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 覆盖。
相关推荐
java1234_小锋2 小时前
Java高频面试题:RocketMQ有哪些使用场景?
java·zookeeper·java-zookeeper
wellc2 小时前
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
java·spring cloud·微服务
dovens2 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
sinat_255487812 小时前
JSON·学习笔记
java·开发语言·笔记·算法
liqianpin12 小时前
SpringMVC新版本踩坑[已解决]
java
弹简特2 小时前
【JavaEE】MybatisPlus速成
java·数据库·java-ee·mybatis
庞轩px2 小时前
线程池核心参数与拒绝策略深度解析
java·jvm·数据库
guestsun2 小时前
Idea反编译插件--方便查看和修改class文件
java·intellij-idea·jar·反编辑工具·idea反编译插件·class反编译·jar反编译
工边页字2 小时前
图文教学,服务端如何发送(钉钉 +飞书 )机器人通知
java·前端·后端