Java 弹簧反应堆:如何压缩两个通量,但有秩序吗?

Java 弹簧反应堆:如何压缩两个通量,但有秩序吗?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,假设我有两个外部服务。假设我们有一个itemFoo,serviceA返回itemA,serviceB返回itemB 我想要得到的是(A,B)形式的处理程序,其中A和B是同一查询项的对应对象 Flux::zip是迄今为止我找到的最接近的东西,但它不是我想要的东西,因为订单没有承诺。我在找像这样的东西 我总是可以通过使这两个调用同步来作弊,但这会让反应式编程失去所有乐趣。或者,我可以管理一些缓存并仅在两个项目到达时发出记录,但我更喜欢无状态的东西 签出:。您可以根据需要探索其他concat变体 注意

假设我有两个外部服务。假设我们有一个item
Foo
,serviceA返回item
A
,serviceB返回item
B

我想要得到的是
(A,B)
形式的处理程序,其中
A
B
是同一查询项的对应对象

Flux::zip
是迄今为止我找到的最接近的东西,但它不是我想要的东西,因为订单没有承诺。我在找像这样的东西

我总是可以通过使这两个调用同步来作弊,但这会让反应式编程失去所有乐趣。或者,我可以管理一些缓存并仅在两个项目到达时发出记录,但我更喜欢无状态的东西

签出:。您可以根据需要探索其他concat变体


注意:
Flux.concat(f1,f2)
f1.concatWith(f2)
基本相同。

如果在
zip
操作之前或期间使用
Flux.flatMap(f1)
Flux.flatMap(f2)
,请检查这些
flatMap
是否正在执行其他异步方法,如API端点调用。在这种情况下,您可能需要为
Flux.flatMapSequential(f1)
Flux.flatMapSequential(f2)
替换它们,以在转换后保持
Flux
元素的顺序。

您所说的“顺序未承诺”是什么意思
zip(A,B,C)
确实保证zipper
函数
将以
[A,B,C]
顺序接收
对象的数组。唯一的问题是,如果三个源中的一个发射比其他源少(zip的结果与最短源的“大小”相同)@SimonBaslé,实际上你是对的。但是我发现了
zip()
的另一个问题。它使您等待最慢的项目,然后再继续下一个项目。也许我会就此提出另一个问题。如果你的意思是“它等待最慢的源”,那么对于真正的异步源来说,情况就不应该是这样了。例如,
Mono.delay(of seconds(3)).log().zipWith(Mono.delay(of millis(500)).log())
应显示源B已订阅/发射,尽管源A仍在飞行中。也许您的源A是一个阻塞可调用的?