Akka stream - 列出了对各个元素的异步

时间:2016-07-18 17:34:29

标签: scala akka akka-stream

我的流有一个Flow,其输出是List [Any]对象。我希望有一个mapAsync,后跟一些其他阶段,每个阶段处理一个单独的元素而不是列表。我怎么能这样做?

实际上我想连接

的输出
Flow[Any].map { msg =>
  someListDerivedFrom(msg)
}

被消费 -

Flow[Any].mapAsyncUnordered(4) { listElement =>
  actorRef ? listElement
}.someOtherStuff

我该怎么做?

1 个答案:

答案 0 :(得分:7)

我认为您正在寻找的组合子是mapConcat。该组合器将接受输入参数并返回Iterable的内容。一个简单的例子如下:

implicit val system = ActorSystem()
implicit val mater = ActorMaterializer()

val source = Source(List(List(1,2,3), List(4,5,6)))
val sink = Sink.foreach[Int](println)

val graph =
  source.
    mapConcat(identity).
    to(sink)
graph.run

在这里,我的Source正在吐出List个元素,而我的Sink接受List个内容的基础类型。由于类型不同,我无法将它们直接连接在一起。但是如果我在它们之间应用mapConcat,它们就可以连接起来,因为组合器会将这些List元素展平,向下游发送它们各自的元素(Int)。由于mapConcat的输入元素已经是Iterable,因此您只需使用identify正文中的mapConcat函数即可生效。