Scala Akka流图恢复问题
我已经创建了一个图形来并行两个具有相同输入的流。流动产生未来[期权[实体]]。如果flowA失败,我想返回一个未来[无],但恢复似乎没有被调用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._
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]