路由器的Akka Supervisor策略

时间:2017-05-06 14:46:49

标签: akka

我对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
}

1 个答案:

答案 0 :(得分:0)

关于问题#1:这是预期的。您在此处调用的sender()MasterActor上下文中的deadLetters。只允许在消息处理期间调用此方法,因此未定义此示例中的行为。 (这里对RoundRobinPool的引用令人困惑,这在Akka的2.5.1版本中得到了改进)

关于问题#2,我不太确定,我怀疑这与你将RemoteRouterConfig包裹在wget -recursive这个事实有关,但我并不熟悉与系统的那一部分。