Akka Streams错误处理。如何知道哪一行失败?

时间:2017-09-21 02:23:57

标签: scala akka-stream

我读了关于akka stream错误处理的这篇文章

http://doc.akka.io/docs/akka/2.5.4/scala/stream/stream-error.html

并编写了此代码。

val decider: Supervision.Decider = {
  case _: Exception => Supervision.Restart
  case _ => Supervision.Stop
}

implicit val actorSystem = ActorSystem()
implicit val actorMaterializer = ActorMaterializer(ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider))

val source = Source(1 to 10)
 val flow = Flow[Int].map{x => if (x != 9) 2 * x else throw new Exception("9!")}
 val sink : Sink[Int, Future[Done]] = Sink.foreach[Int](x => println(x))
 val graph = RunnableGraph.fromGraph(GraphDSL.create(sink){implicit builder => s =>
  import GraphDSL.Implicits._
  source ~> flow ~> s.in
  ClosedShape
})
val future = graph.run()
future.onComplete{ _ =>
  actorSystem.terminate()
}
Await.result(actorSystem.whenTerminated, Duration.Inf)

这非常有效....除了我需要扫描输出以查看未处理的行。有没有办法打印/记录失败的行? [在我写的每一个流程中都没有显式的try / catch块?]

所以例如,如果我使用的是actor(而不是流),我可以编写一个actor的生命周期事件,当一个actor重新启动时,我可能已经记录了重启时正在处理的消息

但是我在这里并没有明确地使用actor(尽管它们是在内部使用的)。是否存在流/源/接收器的生命周期事件?

1 个答案:

答案 0 :(得分:2)

对您的代码进行一些小修改:

  val decider: Supervision.Decider = {
  case e: Exception =>
    println("Exception handled, recovering stream:" + e.getMessage)
    Supervision.Restart
  case _ => Supervision.Stop
}

如果您将有意义的消息传递给流中的例外,例如,您可以在监督决策程序中打印它们。

我使用println给出快速简短的答案,但强烈建议使用 一些日志库,例如scala-logging