流内的Akka-Stream流

时间:2017-09-02 23:34:38

标签: akka-stream

我正在试图弄清楚如何处理一个情况,在你的一个阶段你需要进行一个返回一个InputStream的调用,在那里我将处理该流作为进一步向下的阶段的源。

e.g。

 Source.map(e => Calls that return an InputStream)
 .via(processingFlow).runwith(sink.ignore)

我希望将Processing流程中的元素作为来自InputStream的元素。这基本上是我正在拖尾文件,读取每一行,该行给我关于我需要针对CLI api进行的调用的信息,当进行该调用时,我将Stdout作为InputStream从中读取结果。结果大部分时间都是巨大的,所以我可以 只收集记忆中的所有东西。

中号

1 个答案:

答案 0 :(得分:1)

  • 您可以使用StreamConverters实用程序从java.io流中获取SourceSink。更多信息here
  • 您可以使用flatMapConcatflatMapMergeSource的流展平为单个流。更多信息here

一个简单的例子可能是:

  val source: Source[String, NotUsed] = ???
  def gimmeInputStream(name: String): InputStream = ???
  val processingFlow: Flow[ByteString, ByteString, NotUsed] = ???

  source
    .map(gimmeInputStream)
    .flatMapConcat(is ⇒ StreamConverters.fromInputStream(() ⇒ is, chunkSize = 8192))
    .via(processingFlow)
    .runWith(Sink.ignore)

然而,Akka Streams提供了更加惯用的DSL来读取/写入FileIO对象中的文件。更多信息here

示例变为:

  val source: Source[String, NotUsed] = ???
  val processingFlow: Flow[ByteString, ByteString, NotUsed] = ???

  source
    .flatMapConcat(name ⇒ FileIO.fromPath(Paths.get(name)))
    .via(processingFlow)
    .runWith(Sink.ignore)