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

标签 project-reactor

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/

相关文章:

json - 使用 WebFlux 从资源中读取和解析文件的 react 方式?

Java Reactor - 条件流执行

java - 如何将 Micrometer 计时器与 webflux 端点一起使用

spring-webflux - Mono/Flux.fromCallable 和 Mono.defer 的区别

spring-boot - 为什么 Flux 启动后不能使用 concatWith

java - 如何从 Http 集成流创建 Spring Reactor Flux?

java - 有条件地将 Mono 与 Flux 结合起来

Spring 5 Web Reactive - Web 客户端 - 在响应流上使用 flatmap()

project-reactor - 可观测量到通量的转换

java - FlatMap 调用后,Reactor 不支持 runOn