我对Akka很新,我有以下问题:
我有一个MasterActor,其中定义了路由器,这是我定义SupervisionStrategy的地方:
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方法中放置了一个print语句,我看到只重新启动了一个actor。这让我相信我走在了正确的轨道上。
但是,到目前为止我有两个问题:
问题#1:
我注意到print语句中的sender是deadLetters。我以为它是失败的演员。
问题#2:
我在postRestart方法中放了一个print语句,我发现当遇到FileNotFound异常并且处理继续时,只重新启动一个routee。这似乎是正确的行为。
但是,如果我在FileNotFound异常上将supervisorStrategy更改为Stop(如下所示),我看到所有actor都停止了,我根本没有进行任何处理。我希望所有actor都能看到处理,直到遇到FileNotFound异常。当失败的actor遇到FileNotFound异常时,我认为只有该actor应该被停止而其他人应该继续处理。
override val supervisorStrategy = OneForOneStrategy() {
case _: FileNotFoundException =>
println("****** Failed actor in FileNotFound: " + sender)
Stop
}
答案 0 :(得分:0)
关于问题#1:这是预期的。您在此处调用的sender()
是MasterActor
上下文中的deadLetters
。只允许在消息处理期间调用此方法,因此未定义此示例中的行为。 (这里对RoundRobinPool
的引用令人困惑,这在Akka的2.5.1版本中得到了改进)
关于问题#2,我不太确定,我怀疑这与你将RemoteRouterConfig
包裹在wget -recursive
这个事实有关,但我并不熟悉与系统的那一部分。