我正在尝试使用Supervision stategy进行恢复,当我使用map编写Flow阶段时它会起作用,但是如果我使用的是graph阶段,则它永远不会被捕获,并且整个管道都会失败
object test extends App{
val stageSupervisionDecider: Supervision.Decider = {
case cEx: IllegalArgumentException =>
println("Supervision Catch")
Supervision.Resume
case _ => Supervision.Stop
}
implicit val system = ActorSystem("system")
implicit val materializer = ActorMaterializer(
ActorMaterializerSettings(system)
.withSupervisionStrategy(stageSupervisionDecider)
)
Source(Vector(1,2,3,4,5,6,7))
.via(new FailFlow)
.runWith(Sink.foreach(println))
}
class FailFlow extends GraphStage[FlowShape[Int, Int]] {
val in = Inlet[Int]("FailFlow.In")
val out = Outlet[Int]("FailFlow.Out")
override def shape: FlowShape[Int, Int] = FlowShape.of(in, out)
override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = {
new GraphStageLogic(shape) {
setHandler(in, new InHandler {
override def onPush(): Unit = {
val m = grab(in)
if(m % 2 == 0)
throw new IllegalArgumentException("illegal value")
else
push(out,m)
}
})
setHandler(out, new OutHandler {
override def onPull(): Unit = {
pull(in)
}
})
}
}
}
任何想法在这里发生了什么错误?
答案 0 :(得分:2)
根据documentation(大红框):
ZipWith,GraphStage联结,ActorPublisher源和ActorSubscriber接收器组件不遵守监督策略属性