如果在Source内部发生错误,为什么流不会继续

时间:2018-02-25 19:19:52

标签: scala akka akka-stream

我编写了一个scala流应用程序。我的目标是,如果在流处理期间某个项目在处理过程中遇到错误,那么该流将忽略它并继续处理剩余的项目。

为实现这一目标,我编写了这段代码

object StreamRestart extends App {
   implicit val actorSystem = ActorSystem()
   implicit val ec : ExecutionContext = actorSystem.dispatcher
   var failed: ListBuffer[Int] = ListBuffer()
   val decider : Supervision.Decider = {
      case x : Exception => {
         println(s"failed with error $x")
         failed += x.getMessage.toInt
         Supervision.Restart
      }
   }
   implicit val actorMaterializer = ActorMaterializer(ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider))
   def source : Source[Int, NotUsed] = {
      val iter  = (1 to 1000 toStream) map {x => if (x == 600) throw new Exception(x.toString) else x}
      Source(iter)
   }

   val sink : Sink[Int, Future[Done]] = Sink.foreach[Int]{i => println(i)}
   val future : Future[Done] = source.runWith(sink)
   val f = future.map{_ =>
      println("completed")
      actorSystem.terminate()
   }
   Await.result(f, Duration.Inf)
   println(s"who failed ${failed.toList}")
}

上面的代码在600处崩溃,即使我的决策者说'#34;重启"。如果我移动这个例外,那么" flow"然后决策器工作,流进程直到达到1000.但如果在源函数内发生错误,应用程序崩溃。

有没有办法让我的应用程序以一种始终到达目的的方式变得万无一失。否则,我们如何在源函数中发生错误时从错误中恢复。

0 个答案:

没有答案