Akka Streams:限制文件源

Akka Streams:限制文件源,akka,akka-stream,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.fromP

我有一个文件,里面有几千行这样的内容

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())
我无法从研究这个问题中找到任何解决办法

如果有任何提示,我们将不胜感激。

使用runWith,而不是to,与flow1:

val source:source[ByteString,Future[IOResult]]=FileIO.fromPathfile val flow1= 流[通过测试环] .viaFraming.delimiterByteStringSystem.lineSeparator,10000 .throttle1,1.second,1,ThrottleMode.shaping .mapbs=>bs.utf8String val sink=sink.foreachprintln source.viaflow1.runWithsink.onComplete=>system.terminate 返回源的物化值,即Source.viaflow1,因此在流的左侧完成时终止actor系统。您要做的是在接收器的物化值完成时关闭系统。使用runWith返回Sink参数的具体化值,相当于:

来源 .viaflow1 .托马辛基普,对 跑 .onComplete_uz=>system.terminate
所以我猜我的流是按预期工作的,但是我使用了水槽错误地调试了它。