为什么 .share() 对冷源没有影响(自动连接与 refCount)?

a b*_*ver 2 project-reactor

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

shared.subscribe(System.out::println);
shared.subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

由于share()将通量变成热通量,我希望第一个订阅者获得所有值,而第二个订阅者则得不到任何值,因为流在​​订阅时已完成。share但输出与没有:相同1 2 1 2,但它应该只是1 2.

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

a b*_*ver 7

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

share()是 的快捷方式publish().refCount()refCount()除了一项附加功能之外,它就像其他功能一样autoConnect():当所有订阅者都取消时,它会断开连接,或者 - 这就是这里的情况 - 流已完成。

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

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

autoConnect但是,并不会取消订阅。如果您使用它而不是refCount保留对原始通量的订阅,但由于流已完成,任何其他订阅者都不会收到任何值。