我想像使用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()运算符。为什么不存在?
答案 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}}没有任何有意义的效果。)