【问题标题】:Debugging "NoSuchElementException: Source was empty" errors with project reactor使用项目反应器调试“NoSuchElementException:源为空”错误
【发布时间】:2019-09-07 19:29:33
【问题描述】:
【问题讨论】:
标签:
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 已发出,但没有通过第一个过滤器
-
2 和 3 分别与 0 和 1 具有相同的模式
-
4 通过了“仅偶数”过滤器,但没有进一步(因此在第二个过滤器中失败)
-
5 及以上或任何其他元素从未从最初的 Flux.range() 调用中发出。
对于上一个问题,您可能已经注意到userMono 在第二次被调用时从未发出任何内容,这可能有助于缩小问题范围。