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()
时,它按预期工作。那是为什么?
答案 0 :(得分:2)
答案很简单,但我花了一段时间才弄明白。
share()
是publish().refCount()
的快捷方式。 refCount()
与autoConnect()
类似,只有一个附加功能:当所有订阅者都取消时它会断开连接,或者 - 这就是这里的情况 - 流已经完成。
第一个shared.subscribe
为原始流量创建订阅(通过share
)。立即发出所有值,流完成,订阅被取消。
由于现在没有订阅,第二个shared.subscribe
再次创建订阅,流从头开始。
autoConnect
不会取消订阅。如果您使用它而不是refCount
,则原始流量的订阅仍然存在,但由于流已完成,因此任何其他订户都不会收到任何值。