Scala Akka流图恢复问题

Scala Akka流图恢复问题,scala,akka,akka-stream,Scala,Akka,Akka Stream,我已经创建了一个图形来并行两个具有相同输入的流。流动产生未来[期权[实体]]。如果flowA失败,我想返回一个未来[无],但恢复似乎没有被调用 val graph: Flow[Input, (Future[Option[Entity]], Future[Option[Entity]]), NotUsed] = Flow.fromGraph(GraphDSL.create() { implicit builder => import GraphDSL.Implicits._

我已经创建了一个图形来并行两个具有相同输入的流。流动产生未来[期权[实体]]。如果flowA失败,我想返回一个未来[无],但恢复似乎没有被调用

    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时,不会执行恢复。作为一种解决方法,我将在处理结束时恢复未来,但我希望在设计图形时使用这种逻辑。

当异常从上游传播时,
恢复
组合器将发挥作用。
Future.failed
不是异常,而是有效元素。 你需要像这样的东西

flowA.map(_.recover{ case t: Throwable =>
      logger.error(t, "Error retrieving output from flowA. Resuming without them.")
      None
    })
另一方面,您真的需要在流程中传递未来吗?在构建
flowA
flowB
时,最好使用
mapsync
,让它们只生成
选项[Entity]