如何从akka流源获取迭代器?

时间:2017-09-06 03:28:39

标签: java akka akka-stream akka-http

我试图创建一个我可以通过类似Iterator之类的东西来消费的流程。 我实现了一个公开类似迭代器的接口的库,所以这对我来说是最简单的事情。

到目前为止我设计的图表基本上是Source<Iterator<DataRow>>。到目前为止我看到的一件事是将其展平为Source<DataRow>,然后使用http://doc.akka.io/japi/akka/current/akka/stream/javadsl/StreamConverters.html#asJavaStream--后跟https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#iterator--

但考虑到可能会有很多行,我想知道是否有必要避免扁平步骤(至少在akka流的背景下,我假设那里有's'。通过阶段传递时,每个元素的一些小的开销,或者是否有更直接的方式。

另外,我很好奇背压在创建的流中是如何工作的,尤其是儿童迭代器;它只缓冲一个元素吗?

1 个答案:

答案 0 :(得分:1)

展平步骤

Source<Iterator<DataRow>>展平为Source<DataRow>会增加一些开销,因为您必须使用最终flatMapConcatcreate a new GraphStage

然而,如果你有很多&#34;行然后这个单独的阶段可能派上用场,因为它将为展平步骤提供并发性。

<强>背压

如果您查看StreamConverters.asJavaStream的{​​{3}},您会看到有一个QueueSink正在产生一个Future来从akka流中提取下一个元素,然后执行Await.result(nextElementFuture, Inf)等待Future完成,以便下一个元素可以转发到java Stream。

回答你的问题:是的,子迭代器只缓冲一个元素,但QueueSink有一个Future,也可能有下一个DataRow。因此javaStream&amp;迭代器可能有2个缓冲元素,但是在原始的akka​​ Source中进行了很多缓冲。