【问题标题】:Debugging "NoSuchElementException: Source was empty" errors with project reactor使用项目反应器调试“NoSuchElementException:源为空”错误
【发布时间】:2019-09-07 19:29:33
【问题描述】:

我正在寻找有关如何查明以下错误的提示:

NoSuchElementException: Source was empty

同时使用项目反应器。这表明Mono/Flux 没有发出任何结果,但我应该如何找出原因?

我目前使用Hooks.onOperatorDebug();,这很有帮助,但我正在寻找其他方法来找出此类错误的原因。

欢迎任何关于最佳实践的意见或建议。

附注我在这里打开了另一个问题:Issue with use of project reactor's flatMap and switchIfEmpty operators 与此相关。

【问题讨论】:

    标签: reactive-programming project-reactor


    【解决方案1】:

    仅使用log() 在这里可以大有帮助。

    采取如下方式:

    Flux.range(0, 5)
            .log("Initial")
            .filter(x -> x%2==0)
            .log("Even only")
            .filter(x -> x<3)
            .log("Less than 3 only")
            .subscribe(System.out::println);
    

    从日志中取出相关部分,将显示:

    21:08:28.809 [main] INFO Initial - | onNext(0)
    21:08:28.809 [main] INFO Even only - | onNext(0)
    21:08:28.809 [main] INFO Less than 3 only - | onNext(0)
    0
    21:08:28.809 [main] INFO Initial - | onNext(1)
    21:08:28.809 [main] INFO Initial - | onNext(2)
    21:08:28.810 [main] INFO Even only - | onNext(2)
    21:08:28.810 [main] INFO Less than 3 only - | onNext(2)
    2
    21:08:28.810 [main] INFO Initial - | onNext(3)
    21:08:28.810 [main] INFO Initial - | onNext(4)
    21:08:28.810 [main] INFO Even only - | onNext(4)
    

    这使我们能够推断出每个元素被过滤的位置,或者它是否首先被发出。由上我们可以推断:

    • 0 已发出,使其通过“仅偶数”过滤器,然后通过“仅小于 3”过滤器;
    • 1 已发出,但没有通过第一个过滤器
    • 23 分别与 01 具有相同的模式
    • 4 通过了“仅偶数”过滤器,但没有进一步(因此在第二个过滤器中失败)
    • 5 及以上或任何其他元素从未从最初的 Flux.range() 调用中发出。

    对于上一个问题,您可能已经注意到userMono 在第二次被调用时从未发出任何内容,这可能有助于缩小问题范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2021-08-08
      • 2012-05-03
      • 2021-03-26
      • 2022-09-25
      • 2023-01-27
      • 1970-01-01
      相关资源
      最近更新 更多