【问题标题】:Akka Supervisor Strategy for Router路由器的 Akka 主管策略
【发布时间】: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


    【解决方案1】:

    关于问题 #1:这是意料之中的。您在此处调用的sender() 是您的MasterActor 上下文中的那个。只允许在消息处理期间调用此方法,因此本示例中的行为未定义。 (这里对deadLetters的引用比较混乱,Akka的2.5.1版本已经改进了)

    关于问题 #2,我不太确定,我怀疑这与您将 RoundRobinPool 包装在 RemoteRouterConfig 中的事实有关,但我对系统。

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多