Java Spring Reactor:switchIfEmpty和onErrorContinue-错误还是功能?
我使用开关ifempty和OneRorContinue做了一个有趣的观察 鉴于以下管道(科特林): 外部管道将密钥流映射到域对象的Mono,并通过Java Spring Reactor:switchIfEmpty和onErrorContinue-错误还是功能?,java,kotlin,project-reactor,Java,Kotlin,Project Reactor,我使用开关ifempty和OneRorContinue做了一个有趣的观察 鉴于以下管道(科特林): 外部管道将密钥流映射到域对象的Mono,并通过someFunction对其进行管道传输,并通过someRepository功能保存它 如果findByKey函数在没有数据的情况下完成(在repo中找不到域对象),它应该直接转到管道中的开关ifempty。好的,到目前为止还不错 在内部管道抛出异常之前,上面的描述可以完美地工作。然后管道不再继续,订户将收到onError使用者功能的通知 如果我们想在
someFunction
对其进行管道传输,并通过someRepository
功能保存它
如果findByKey
函数在没有数据的情况下完成(在repo中找不到域对象),它应该直接转到管道中的开关ifempty
。好的,到目前为止还不错
在内部管道抛出异常之前,上面的描述可以完美地工作。然后管道不再继续,订户将收到onError使用者功能的通知
如果我们想在抛出异常的情况下继续内部管道,只需尝试外部通量中的下一个键,该怎么办
这是可能的,我们引入了一个新的操作符或continue:
Flux.fromIterable(keys).concatMap { key ->
someRepository.findByKey(key)
.map { domain -> someFunction(domain) }
.flatMap { domain -> someRepository.save(domain) }
.switchIfEmpty(Mono.defer { onEmptyFunction().toMono() })
}.onErrorContinue(::someLog)
现在,即使内部管道抛出异常,管道也应该继续工作(我测试了它)
然而,有趣的观察结果出现了:如果内部管道引发异常,switchIfEmpty函数也会被调用 这意味着
switchIfEmpty
在两个事件中执行:-findByKey以一个空单声道结束
-内部管道引发异常(例如,
someFunction
)
这与上面没有onErrorContinue
的管道有根本不同,如果内部管道抛出异常,则switchIfEmpty将不执行
问题:这是故意的行为吗?
这是一个错误吗?
我是否可以控制switchIfEmtpy仅对
空数据执行而不是对错误执行
这真是一个危险的局面,让我有一段时间不安 OneRorContinue是一个非常特殊的操作符,我建议阅读以下讨论:虽然,我不完全确定这是否是这里的预期行为。谢谢。这个链接有助于清理烂泥!我有一个类似的问题,我创建了一个,因为这个行为真的很奇怪。OneRorContinue是一个非常特殊的操作符,我建议阅读下面的讨论:虽然,我不完全确定这是否是这里的预期行为。谢谢。这个链接有助于清理烂泥!我有一个类似的问题,并创造,因为这种行为真的很奇怪。
Flux.fromIterable(keys).concatMap { key ->
someRepository.findByKey(key)
.map { domain -> someFunction(domain) }
.flatMap { domain -> someRepository.save(domain) }
.switchIfEmpty(Mono.defer { onEmptyFunction().toMono() })
}.onErrorContinue(::someLog)