Flux<Integer> shared = Flux.just(1, 2).share();
shared.subscribe(System.out::println);
shared.subscribe(System.out::println);
由于 share()
将流量变成热流量,我希望第一个订阅者获得所有值,而第二个订阅者什么也得不到,因为流在订阅时已经完成。但输出与没有 share
时相同:1 2 1 2
,但它应该只是 1 2
。
当我将 share()
替换为 publish.autoconnect()
时,它按预期工作。这是为什么?
最佳答案
答案很简单,但我花了一些时间才弄明白。
share()
是 publish().refCount()
的快捷方式。 refCount()
类似于 autoConnect()
,除了一项附加功能:它会在所有订阅者都取消或 - 这就是这里的情况 - 流已完成时断开连接。
第一个 shared.subscribe
创建对原始通量的订阅(通过 share
)。所有值立即发出,流完成,订阅被取消。
由于现在没有订阅,第二个 shared.subscribe
再次创建一个订阅,流再次从头开始。
autoConnect
不会取消订阅。如果您使用它而不是 refCount
,对原始通量的订阅仍然存在,但由于流已完成,任何其他订阅者都不会收到任何值。
关于project-reactor - 为什么 .share() 对冷源没有影响(自动连接与 refCount)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50528668/