2017-05-06 65 views
0

我很新的阿卡,我有以下问题:阿卡主管战略路由器

我在那里一个路由器定义一个MasterActor而这正是我所定义的supervisionStrategy:

override val supervisorStrategy = OneForOneStrategy() { 
case _: FileNotFoundException => 
println("****** Failed actor in FileNotFound: " + sender) 
Restart 
} 

然后我通过这个supervisionStrategy到路由器:

val router = context.actorOf(RemoteRouterConfig(RoundRobinPool(3, supervisorStrategy=supervisorStrategy), addresses).props(Props(classOf[MapActor], reduceActor)), "router") 

我把打印语句在postRestart方法,我看到只有一个演员重新启动。这使我相信我走在了正确的轨道上。

不过,我有2个问题至今:

问题#1:

我注意到,发件人在打印语句deadLetters。我预计它会成为失败的演员。

问题2:

我把打印语句在postRestart方法,我看到,在遇到FileNotFound异常,当只有一个routee重启和的继续处理。这似乎是正确的行为。但是,如果我将SupervisorStrategy更改为StopNotFound异常(如下所示),我会看到所有actor都停下来,并且我根本没有进行任何处理。我希望所有参与者都能看到处理过程,直到遇到FileNotFound异常。当失败的演员击中FileNotFound异常时,我认为只有该演员应该停止,其他人应该继续处理。

override val supervisorStrategy = OneForOneStrategy() { 
case _: FileNotFoundException => 
println("****** Failed actor in FileNotFound: " + sender) 
Stop 
} 

回答

0

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

关于问题#2,我不太确定,我怀疑它与事实有关,重新包装RoundRobinPoolRemoteRouterConfig,但我不熟悉系统的这一部分。