Akka Streams按类型分割流

时间:2016-11-05 00:23:29

标签: scala akka akka-stream reactive-streams

我有以下简单的案例类层次结构:

sealed trait Message
case class Foo(bar: Int) extends Message
case class Baz(qux: String) extends Message

我有Flow[Message, Message, NotUsed](来自基于Websocket的协议,已经有编解码器)。

我想将此Flow[Message]解复用为Foo和Baz类型的单独流程,因为它们由完全不同的路径处理。

最简单的方法是什么?应该是显而易见的,但我遗漏了一些东西......

1 个答案:

答案 0 :(得分:6)

一种方法是使用create a RunnableGraph,其中包含每种类型消息的流量。

val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>

  val in = Source(...)  // Some message source
  val out = Sink.ignore

  val foo = builder.add(Flow[Message].map (x => x match { case f@Foo(_) => f }))
  val baz = builder.add(Flow[Message].map (x => x match { case b@Baz(_) => b }))
  val partition = builder.add(Partition[Message](2, {
    case Foo(_) => 0
    case Baz(_) => 1
  }))

  partition ~> foo ~> // other Flow[Foo] here ~> out
  partition ~> baz ~> // other Flow[Baz] here ~> out

  ClosedShape
}

g.run()