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 覆盖。
相关推荐
写后端的胖头鱼9 分钟前
Redis 的 RDB 和 AOF
java·数据库·redis
cxoptics13 分钟前
LBO 激光损伤阈值 LIDT 典型数值?如何避免晶体打坏?
java
逐米时代24 分钟前
远程运维诊断减少到场率
java·服务器·前端
禾小西28 分钟前
Redis AOF 日志:宕机了,如何避免数据丢失?
java·redis·mybatis
xuxigifxfh43 分钟前
HJ11 数字颠倒
java·开发语言·华为机考
wno7041 小时前
Spring Boot整合Quartz
java·spring boot·后端
步行cgn1 小时前
MySQL 报错:Access denied for user ‘root‘@‘localhost‘ 详解
java·数据库·spring
一个有温度的技术博主2 小时前
深拷贝和浅拷贝:一次“搬家”事故
java·后端
程序员清风2 小时前
AI时代建议学点自己真正感兴趣的!
java·后端·面试
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: Nacos 配置热更新
java·spring·spring cloud