Spring Reactor onErrorContinue 不工作

2023-12-21

As per 文档 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#onErrorContinue-java.util.function.BiConsumer-我期待着onErrorContinue将忽略错误元素并继续序列。下面的测试用例失败但有异常

java.lang.AssertionError:期望“expectNext(12)”失败(预期:onNext(12);实际:onError(java.lang.RuntimeException:

@Test
public void testOnErrorContinue() throws InterruptedException {
    Flux<Integer> fluxFromJust = Flux.just(1, 2,3,4,5)
            .concatWith(Flux.error(new RuntimeException("Test")))
            .concatWith(Flux.just(6))
            .map(i->i*2)
            .onErrorContinue((e,i)->{
                System.out.println("Error For Item +" + i );
            })
            ;
    StepVerifier
            .create(fluxFromJust)
            .expectNext(2, 4,6,8,10)
            .expectNext(12)
            .verifyComplete();
}

onErrorContinue()可能没有按照你想象的那样做——它让上游运营商recover如果它们碰巧支持这样做,则可能会避免它们内部可能发生的错误。这是一个相当专业的操作员。

在这种情况下map()实际上支持onErrorContinue,但 map 实际上并没有产生错误 - 错误已经插入到流中(通过concat()和明确的Flux.error()调用。)换句话说,根本没有操作符产生错误,因此它无法恢复,因为提供的元素是错误的。

如果您更改了流,以便map()实际上caused错误,那么它将按预期工作:

Flux.just(1, 2,3,4,5)
        .map(x -> {
            if(x==5) {
                throw new RuntimeException();
            }
            return x*2;
        })
        .onErrorContinue((e,i)->{
            System.out.println("Error For Item +" + i );
        })
        .subscribe(System.out::println);

生产:

2
4
6
8
Error For Item +5

根据实际用例,另一种选择可能是使用onErrorResume()在可能错误的元素(或元素源)之后:

Flux.just(1, 2, 3, 4, 5)
        .concatWith(Flux.error(new RuntimeException()))
        .onErrorResume(e -> {
            System.out.println("Error " + e + ", ignoring");
            return Mono.empty();
        })
        .concatWith(Flux.just(6))
        .map(i -> i * 2)
        .subscribe(System.out::println);

一般来说,使用另一个“onError”运算符(例如onErrorResume())通常是更常用、更推荐的方法,因为onErrorContinue()取决于运营商的支持并影响上游,而不是下游运营商(这是不寻常的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Reactor onErrorContinue 不工作 的相关文章

随机推荐

  • 在日期范围和特定时间范围之间选择

    有没有办法在日期和特定时间范围之间选择记录 例如2013年11月1日到2013年11月30日05 00到15 00之间的所有记录 这是我到目前为止所做的 select count as total from tradingaccounts
  • 在Python中处理大二项式的求和

    我需要计算这个公式 它是这个积分的近似值 不过没关系 实际上我只是想计算Figure的值1 https i stack imgur com fi12W gif with PYTHON 这就是主题所关心的 K alpha 和 sigma 是单
  • 如何显示子模块获取的进度?

    我知道我可以告诉 Git 显示进度 例如 Resolving deltas 98 123 125 传递命令行参数时 progress到 例如获取命令 但我们有几个大型子模块 但没有显示任何进展 如何告诉 Git 也显示克隆子模块的进度 例如
  • Excel 剪贴板清除

    我是编写 Excel 宏的新手 但我正在努力完成工作 不管怎样 我试图将数据从 2 个工作表导出到另一个工作簿中的另外 2 个工作表 但是当我达到清除剪贴板的程度时 它根本不起作用 有人可以帮助我吗 这是我的代码 Sub manufactu
  • 使用 ReactJS 将插件添加到 CKEditor5 的自定义构建中

    我正在尝试向 CKEditor5 的经典版本添加一个插件 我已按照此页面上的说明进行操作 https ckeditor com docs ckeditor5 latest installation plugins installing pl
  • Mapbox gl js - 如何在单个图层上添加多个照片源

    每 2 秒我创建一个新的图像源并为该源创建一个新图层 map addSource source photo id type image url photo url coordinates map addLayer id layer phot
  • 优化 JavaScript 代码以查找数组中 3 个最大元素及其索引?

    我需要此 JavaScript 代码的更优化版本来查找数组中的 3 个最大值 我需要获取最大数字的索引 还有其他更简单的方法可以解决问题吗 var maxIndex new Array var maxPoints new Array var
  • 使用 XPath 从参数映射构建 URL 查询字符串

    从 URL 构建 URL 查询字符串的最易读的方法是什么 param value XSLT XPath 3 0 中的映射 以下功能将起作用 declare function local build uri base uri as xs st
  • C++ 中“cv-unqualified”是什么意思?

    从主题来看 我在最近问的一个问题中看到了这个术语 显然这是一个完善的术语 但我在 Stack Overflow 上找不到任何内容 有基本类型和复合类型 基本类型是算术类型 void and std nullptr t 复合类型是数组 函数
  • FB Like 按钮只显示一次 - 第一次加载我的 AngularJS 视图时

    我正在尝试将类似 FB 的按钮放置在基于 Angular JS 构建的单页网站上 点赞按钮必须显示在控制器显示的视图 不同于index html 上 但 赞 按钮仅在我第一次加载该特定视图时才会显示 如果我在访问另一个视图后返回 该按钮不会
  • 复制 Gradle 中的整个目录

    我有一个这样的目录结构 file1 txt file2 txt dir1 file3 txt file4 txt 我想用要复制的 Gradle https docs gradle org current userguide working
  • 无法通过传递输入来深度扩展 Laravel Artisan Command

    尝试创建一个基本命令 然后扩展它 提供给扩展命令的输入不会使其沿着树向下移动 BaseApiClassBuilder php use Illuminate Console Command class BaseApiClassBuilder
  • 尝试测试隔离的 IQueryable 时出错

    Context 我想测试一段代码是否旨在将某些操作分层IQueryable
  • SSRS ReportViewer 处置时出现空引用异常

    我们当前正在使用 Windows 服务来生成 PDF 文件 我最近正在优化代码并注意到内存的滥用 这是由于缺乏一个using周围的声明var reportViewer new ReportViewer 但是 添加此代码后 代码在关闭后引发了
  • 捕获所有 .htaccess - 仅当之前未找到任何内容时

    htaccess 文件中的 catch all 正则表达式是否可能有例外 这是我当前的 htaccess 文件 RewriteEngine On RewriteBase RewriteCond REQUEST FILENAME f Rewr
  • 如何删除 SQLite 中具有多个 where 参数的行?

    我想删除满足多个条件中任意一个的行 例如 我传递一个 ID 列表 我想删除包含这些 ID 的所有行IDs ID 是唯一的 这将是 String ids 0 1 2 3 database delete rows id OR id OR id
  • 反转 4x4 矩阵

    我正在寻找有关如何反转 4x4 矩阵的示例代码实现 我知道有高斯消除 LU 分解等 但我并没有详细研究它们 而是只是在寻找执行此操作的代码 理想的语言是 C 数据以列优先顺序以 16 个浮点数的数组形式提供 here bool gluInv
  • Visual Studio 扩展 (VSIX) 是否需要强命名?

    Visual Studio 2012 SDK 中的默认 VSPackage 模板生成一个使用强命名的项目 由于强命名是可传递的 这意味着我添加的任何引用 例如同一解决方案中的另一个项目或第三方依赖项 也需要强命名 由于我对强命名第三方依赖项
  • 如何向 SheetJS .xlsx 生成的文件添加单元格边框?

    我有一个SheetJS https github com sheetjs js xlsx xlsx 生成的文件 但我无法放入border to the cells 我有这个 我需要这个 有没有办法做到这一点SheetJS 如果有办法应用其他
  • Spring Reactor onErrorContinue 不工作

    As per 文档 https projectreactor io docs core release api reactor core publisher Flux html onErrorContinue java util funct