为什么.share()对冷源没有影响(autoconnect与refCount)?

时间:2018-05-25 11:55:52

标签: project-reactor

Flux<Integer> shared = Flux.just(1, 2).share();

shared.subscribe(System.out::println);
shared.subscribe(System.out::println);

由于share()将流量变为热点,我希望第一个订户获取所有值,第二个订户获取无,因为流已在订阅时完成。但输出与没有share1 2 1 2的输出相同,但它应该只是1 2

当我用share()替换publish.autoconnect()时,它按预期工作。那是为什么?

1 个答案:

答案 0 :(得分:2)

答案很简单,但我花了一段时间才弄明白。

share()publish().refCount()的快捷方式。 refCount()autoConnect()类似,只有一个附加功能:当所有订阅者都取消时它会断开连接,或者 - 这就是这里的情况 - 流已经完成。

第一个shared.subscribe为原始流量创建订阅(通过share)。立即发出所有值,流完成,订阅被取消。

由于现在没有订阅,第二个shared.subscribe再次创建订阅,流从头开始。

但是,

autoConnect不会取消订阅。如果您使用它而不是refCount,则原始流量的订阅仍然存在,但由于流已完成,因此任何其他订户都不会收到任何值。