Java Spring Reactor:switchIfEmpty和onErrorContinue-错误还是功能?

Java Spring Reactor:switchIfEmpty和onErrorContinue-错误还是功能?,java,kotlin,project-reactor,Java,Kotlin,Project Reactor,我使用开关ifempty和OneRorContinue做了一个有趣的观察 鉴于以下管道(科特林): 外部管道将密钥流映射到域对象的Mono,并通过someFunction对其进行管道传输,并通过someRepository功能保存它 如果findByKey函数在没有数据的情况下完成(在repo中找不到域对象),它应该直接转到管道中的开关ifempty。好的,到目前为止还不错 在内部管道抛出异常之前,上面的描述可以完美地工作。然后管道不再继续,订户将收到onError使用者功能的通知 如果我们想在

我使用开关ifemptyOneRorContinue做了一个有趣的观察

鉴于以下管道(科特林):

外部管道将密钥流映射到域对象的Mono,并通过
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)