Akka合并接收器,无法访问流程

时间:2019-09-26 14:09:10

标签: scala akka akka-stream

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

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,就无法确定是否有从接收器中分离输出的方法。

谢谢!

1 个答案:

答案 0 :(得分:3)

您正在寻找combine 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