Akka Streams:限制文件源

时间:2017-10-24 10:05:07

标签: akka akka-stream

我有一个包含数千行的文件。

Mr|David|Smith|david.smith@gmail.com
Mrs|Teri|Smith|teri.smith@gmail.com
...

我想读取下游但每个行以节流方式发出的文件,即。每秒1次

我无法弄清楚如何让节流工作在流程中。

flow1(下方)在1秒后输出第一行然后终止 flow2(下方)等待1秒然后输出整个文件。

val source: Source[ByteString, Future[IOResult]] = FileIO.fromPath(file)

val flow1 = Flow[ByteString].
              via(Framing.delimiter(ByteString(System.lineSeparator),10000)).
              throttle(1, 1.second, 1, ThrottleMode.shaping).
              map(bs => bs.utf8String)

val flow2 = Flow[ByteString].
              throttle(1, 1.second, 1, ThrottleMode.shaping).
              via(Framing.delimiter(ByteString(System.lineSeparator), 10000)).
              map(bs => bs.utf8String)

val sink = Sink.foreach(println)
val res = source.via(flow2).to(sink).run().onComplete(_ => system.terminate())

我无法通过研究docs收集任何解决方案。

非常感谢任何指针。

1 个答案:

答案 0 :(得分:1)

runWith使用to代替flow1

val source: Source[ByteString, Future[IOResult]] = FileIO.fromPath(file)

val flow1 = 
  Flow[ByteString]
    .via(Framing.delimiter(ByteString(System.lineSeparator), 10000))
    .throttle(1, 1.second, 1, ThrottleMode.shaping)
    .map(bs => bs.utf8String)

val sink = Sink.foreach(println)

source.via(flow1).runWith(sink).onComplete(_ => system.terminate())

to返回Source的具体化值(即source.via(flow1)),因此当"左侧和"左手边& #34;流完成了。您要做的是在Sink的具体化值完成后关闭系统。使用runWith返回Sink参数的具体化值,相当于:

source
  .via(flow1)
  .toMat(sink)(Keep.right)
  .run()
  .onComplete(_ => system.terminate())