为什么这个Akka Streams应用程序异常退出?

时间:2018-02-27 14:15:05

标签: scala akka future akka-stream

我正在通过Packt的Akka Cookbook模块了解Akka Streams。我运行TransformingStreamsApplication.scala示例并获取此信息:

enter image description here

要在流处理完成时让actor系统退出,我添加以下回调:

// Future[IOResult]
val future = stream.run()
future.onComplete(_ => system.terminate())

但是这次应用程序直接退出而没有任何控制台输出:

enter image description here

我提出的解决方法是添加Thread.sleep(10000)

enter image description here

我想解释一下这种行为。

1 个答案:

答案 0 :(得分:2)

以下是您referencing的信息流:

val stream = FileIO.fromPath(path)
  ...
  .to(Sink.foreach(println))

由于使用了to连接器,在上面的流上调用run()会返回源的具体化值,在本例中为Future[IOResult]。发生的事情是你在流元素到达接收器之前终止了actor系统。

使用Thread.sleeptoMat,而不是添加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())