Akka Stream Graph恢复问题

时间:2017-01-24 16:46:49

标签: scala akka akka-stream

我创建了一个图表,用相同的输入对两个流进行并列化。流程产生Future [Option [Entity]]。如果flowA失败,我想返回一个Future [None],但恢复似乎没有被称为

    val graph: Flow[Input, (Future[Option[Entity]], Future[Option[Entity]]), NotUsed] = Flow.fromGraph(GraphDSL.create() { implicit builder =>
    import GraphDSL.Implicits._

    val broadcast = builder.add(Broadcast[Input](2))
    val zip = builder.add(Zip[Future[Option[Entity]], Future[Option[Entity]]])

    val flowAwithRecovery = flowA.recover{ case t: Throwable =>
      logger.error(t, "Error retrieving output from flowA. Resuming without them.")
      Future.successful(None)
    }

    broadcast.out(0) ~> flowAwithRecovery ~> zip.in0
    broadcast.out(1) ~> flowB ~> zip.in1

    FlowShape(broadcast.in, zip.out)
  })

当我运行图表并且flowA返回失败的未来时,恢复不会被执行。作为一种解决方法,我在处理结束时恢复了Future,但我想在设计图形时使用这种逻辑。

1 个答案:

答案 0 :(得分:2)

recover组合器在从上游传播异常时发挥作用。 Future.failed不是例外,而是有效的元素。 你需要像

这样的东西
flowA.map(_.recover{ case t: Throwable =>
      logger.error(t, "Error retrieving output from flowA. Resuming without them.")
      None
    })

另一方面,你真的需要在你的流程中传递Future吗?在构建mapAsyncflowA并让它们只生成flowB时,您最好使用Option[Entity]