我有一个包含数千行的文件。
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收集任何解决方案。
非常感谢任何指针。
答案 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())