Scala Akka组合水槽,无需进入水流

Scala Akka组合水槽,无需进入水流,scala,akka,akka-stream,Scala,Akka,Akka Stream,我使用的API接受单个AKKA接收器并用数据填充: def fillSink(sink:Sink[String, _]) 有没有一种方法,不用深入研究akka的深度,就可以用两个接收器而不是一个接收器来处理输出 比如说 val mySink1:Sink = ... val mySink2:Sink = ... //something fillSink( bothSinks ) 如果我可以访问fillSink方法使用的流,我可以使用Flow.alsoTo(mySink1).to(mySink2

我使用的API接受单个AKKA接收器并用数据填充:

def fillSink(sink:Sink[String, _])
有没有一种方法,不用深入研究akka的深度,就可以用两个接收器而不是一个接收器来处理输出

比如说

val mySink1:Sink = ...
val mySink2:Sink = ...
//something
fillSink( bothSinks )
如果我可以访问
fillSink
方法使用的流,我可以使用
Flow.alsoTo(mySink1).to(mySink2)
,但流没有公开

目前唯一的解决办法是将处理字符串的单个接收器传递给两个StringBuilder,以替换
mySink1/mySink2
,但这似乎违背了AKKA的观点。如果不花几天时间学习AKKA,我就不知道是否有办法将输出从接收器中分离出来

谢谢

Sink操作符,使用提供的
Int=>Graph[UniformFanOutShape[T,U],NotUsed]]
函数组合两个或多个Sink,可能就是您要寻找的:

def combine[T, U](first: Sink[U, _], second: Sink[U, _], rest: Sink[U, _]*)(strategy: Int => Graph[UniformFanOutShape[T, U], NotUsed]): Sink[T, NotUsed]
一个平凡的例子:

val doubleSink = Sink.foreach[Int](i => println(s"Doubler: ${i*2}"))
val tripleSink = Sink.foreach[Int](i => println(s" Triper: ${i*3}"))

val combinedSink = Sink.combine(doubleSink, tripleSink)(Broadcast[Int](_))

Source(List(1, 2, 3)).runWith(combinedSink)

// Doubler: 2
//  Triper: 3
// Doubler: 4
//  Triper: 6
// Doubler: 6
//  Triper: 9

您可以访问流
Flow[T].alsoTo(mySink1).to(mySink2)
您应该检查广播用法是否有答案。这有点难看,但很简单。谢谢@cchantep,
Flow[String]。alsoTo(mySink1)。to(mySink2)
它本身似乎什么也做不了,而我对
Flow[String,String,NotUsed]
实例无能为力?谢谢@aleksey isachenkov!我正试图使用CessionOfTime的答案使之适应我的用例(),但不确定我将如何处理
val流
。当我只参考了水槽时,我还不知道这些方法有什么帮助。