为什么Project Reactor的Mono没有share()运算符?

时间:2019-07-07 13:01:26

标签: project-reactor

我想像使用Flux一样“共享”一个Mono。

Kotlin的Flux share()示例:

fun `test flux share`() {
        val countDownLatch = CountDownLatch(2)

        val originalFlux = Flux.interval(Duration.ofMillis(200))
                .map { "$it = ${Instant.now()}" }
                .take(7)
                .share()
                .doOnTerminate {
                    countDownLatch.countDown()
                }


        println("Starting #1...")

        originalFlux.subscribe {
            println("#1: $it")
        }

        println("Waiting ##2...")
        CountDownLatch(1).await(1000, TimeUnit.MILLISECONDS)
        println("Starting ##2...")

        originalFlux.subscribe {
            println("##2: $it")
        }

        countDownLatch.await(10, TimeUnit.SECONDS)

        println("End!")
    }

我找不到Mono的share()运算符。为什么不存在?

1 个答案:

答案 0 :(得分:1)

  

我找不到Mono的share()运算符。为什么不存在?

share()的特定行为对于Mono而言并没有多大意义,但我们拥有cache(),这可能就是您想要的。

share()等效于您在Flux上调用publish().refcount()。具体来说,publish()为您提供ConnectableFlux或“热”通量。 (refcount()会根据第一个/最后一个订阅者自动连接/停止通量。)

ConnectableFlux的“ raison d'être”允许多个订阅者随时进行订阅,而忽略了订阅之前发出的数据。对于Mono来说,这没有什么意义,因为根据定义,仅发出一个值-因此,如果您错过了它,那么您就错过了它。

但是,我们在Mono上确实有cache(),这也将它变成了一个“热门”资源(每个订阅都不需要原始供应商,第一次订阅只需一次)。上面是为每个订户重播该值,但这几乎可以肯定是您想要的。

(请注意,如果您对上述内容进行了测试-请注意,您需要使用Mono.fromSupplier()而不是Mono.just(),因为后者在实例化时只会获取一次值,因此{{ 1}}没有任何有意义的效果。)