Spring 如何避免在Sping Reactor中对类似订阅服务器重复映射操作?

Spring 如何避免在Sping Reactor中对类似订阅服务器重复映射操作?,spring,kotlin,reactive-programming,project-reactor,Spring,Kotlin,Reactive Programming,Project Reactor,我有一个发布者发出字符串,还有许多订阅者可能使用相同的映射函数来创建具有不同过滤器的模型 出版商: val publisher: Flux<String> = ... 订户#3 订户#4 最后我订阅了所有的通量 Flux.merge(sub1, sub2, sub3, ..., subn) .map{//some logic for following data of subscribers} .subscribe() 问题是:veryExpensiveCon

我有一个发布者发出字符串,还有许多订阅者可能使用相同的映射函数来创建具有不同过滤器的模型

出版商:

val publisher: Flux<String> = ...
订户#3

订户#4

最后我订阅了所有的通量

Flux.merge(sub1, sub2, sub3, ..., subn)
     .map{//some logic for following data of subscribers}
     .subscribe()
问题是:veryExpensiveConverter对每个订阅服务器的同一个已发布记录执行多次。 执行流看起来

Input1 -> veryExpensiveConverter -> filter1 -> output1
       -> veryExpensiveConverter -> filter2 -> output2
       -> veryExpensiveConverter -> cheapConverter -> filter3 -> output3
我也想要

Input1 -> veryExpensiveConverter -> filter1 -> output1  
                                 -> filter2 -> output2
                                 -> cheapConverter -> filter3 -> output3
什么样的模式最适合避免对每个订阅服务器执行相同的映射?

您可以在某种程度上
.share()
,以确保对该共享部分的每个订阅仅触发其上方的单个订阅

您还可以查看更多高级自动触发器的
.publish().xxx()
方法(
.share()
将在第一次订阅时立即启动其源代码)

大概是这样的:

val expensiveDoneOnce = publisher
    .map{veryExpensiveConverter.convert(it)}
    .publish()
    .refCount(2)
val sub1 = expensiveDoneOnce.filter(it.metric < 10)
val sub2 = expensiveDoneOnce.filter(it.metric > 5)
val expensiveDoneOnce=publisher
.map{veryExpensiveConverter.convert(it)}
.publish()
.refCount(2)
val sub1=expensiveDoneOnce.filter(it.metric<10)
val sub2=expensiveDoneOnce.filter(it.metric>5)

谢谢。此外,如果订阅者的数量事先未知,我们无法发布()。。。。正在定义订阅服务器。。。connect()另请参见。
Flux.merge(sub1, sub2, sub3, ..., subn)
     .map{//some logic for following data of subscribers}
     .subscribe()
Input1 -> veryExpensiveConverter -> filter1 -> output1
       -> veryExpensiveConverter -> filter2 -> output2
       -> veryExpensiveConverter -> cheapConverter -> filter3 -> output3
Input1 -> veryExpensiveConverter -> filter1 -> output1  
                                 -> filter2 -> output2
                                 -> cheapConverter -> filter3 -> output3
val expensiveDoneOnce = publisher
    .map{veryExpensiveConverter.convert(it)}
    .publish()
    .refCount(2)
val sub1 = expensiveDoneOnce.filter(it.metric < 10)
val sub2 = expensiveDoneOnce.filter(it.metric > 5)