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 覆盖。
相关推荐
毅炼3 分钟前
MyBatis 常见问题总结
java·数据库·sql·mybatis
清心歌4 分钟前
LinkedList 深入解析
java
鱼鳞_8 分钟前
Java学习笔记_Day32(IO流字符集字符流)
java·笔记·学习
Rsun045519 分钟前
17、Java 责任链模式从入门到实战
java·python·责任链模式
GDAL11 分钟前
IntelliJ IDEA 前端开发全面教程
java·ide·intellij-idea
rabbit_pro11 分钟前
IDEA保存SSH会话信息
java·ssh·intellij-idea
Rsun0455113 分钟前
12、Java 享元模式从入门到实战
java·开发语言·享元模式
小则又沐风a17 分钟前
深剖string内部结构 手撕string
java·前端·数据库·c++
2401_8326355819 分钟前
Spring Data MongoDB 最佳实践:如何构建高效数据访问层
java·mongodb·spring
亚马逊云开发者20 分钟前
Java 8升级Java 17实战:用AWS Transform Custom自动化迁移Spring Boot项目完整教程
java·自动化·aws