【发布时间】:2017-05-06 14:46:49
【问题描述】:
我对 Akka 很陌生,我有以下问题:
我有一个 MasterActor,其中定义了一个路由器,这就是我定义监督策略的地方:
override val supervisorStrategy = OneForOneStrategy() {
case _: FileNotFoundException =>
println("****** Failed actor in FileNotFound: " + sender)
Restart
}
然后我将这个监督策略传递给路由器:
val router = context.actorOf(RemoteRouterConfig(RoundRobinPool(3, supervisorStrategy=supervisorStrategy), addresses).props(Props(classOf[MapActor], reduceActor)), "router")
我在 postRestart 方法中放置了一条打印语句,我看到只有一个参与者重新启动。这让我相信我走在正确的轨道上。
但是,到目前为止,我有 2 个问题:
问题 #1:
我注意到 print 语句中的 sender 是 deadLetters。我以为是失败的演员。
问题 #2:
我在 postRestart 方法中放了一条打印语句,我看到当遇到 FileNotFound 异常并继续处理时,只有一个 routee 被重新启动。这似乎是正确的行为。
但是,如果我在 FileNotFound 异常上将 supervisorStrategy 更改为 Stop(如下所示),我会看到所有参与者都停止了,并且我根本没有进行任何处理。我希望看到所有参与者都进行处理,直到遇到 FileNotFound 异常。当失败的参与者遇到 FileNotFound 异常时,我认为应该只停止该参与者,而其他参与者应该继续处理。
override val supervisorStrategy = OneForOneStrategy() {
case _: FileNotFoundException =>
println("****** Failed actor in FileNotFound: " + sender)
Stop
}
【问题讨论】:
标签: akka