我正在通过Packt的Akka Cookbook模块了解Akka Streams。我运行TransformingStreamsApplication.scala
示例并获取此信息:
要在流处理完成时让actor系统退出,我添加以下回调:
// Future[IOResult]
val future = stream.run()
future.onComplete(_ => system.terminate())
但是这次应用程序直接退出而没有任何控制台输出:
我提出的解决方法是添加Thread.sleep(10000)
:
我想解释一下这种行为。
答案 0 :(得分:2)
以下是您referencing的信息流:
val stream = FileIO.fromPath(path)
...
.to(Sink.foreach(println))
由于使用了to
连接器,在上面的流上调用run()
会返回源的具体化值,在本例中为Future[IOResult]
。发生的事情是你在流元素到达接收器之前终止了actor系统。
使用Thread.sleep
和toMat
,而不是添加Keep.right
,而是更改流以产生接收器的具体化值。此物化值也是Future
,您可以在Future
完成后终止actor系统:
val stream = FileIO.fromPath(path)
...
.toMat(Sink.foreach(println))(Keep.right)
val future = stream.run()
future.onComplete(_ => system.terminate())
请注意,有一种称为runWith
的简写方法:
val stream = FileIO.fromPath(path)
...
.runWith(Sink.foreach(println))
stream.onComplete(_ => system.terminate())