1

我是 Akka 的新手,但我对该指令的理解是,当孩子应该被视为永久停止服务时,它会在内部使用,但有一种方法可以处理完全中断。StopSupervisorStrategies

如果这种理解是正确的,那么我想做的是在正常/主要孩子停止后使用某种“备用演员”,并从那时起将其用作后备。例如,假设我有一个父演员,他有一个子演员——Notifier他的工作是发送电子邮件。如果Notifier真的死了(比如,底层邮件服务器离线),这个actor的备份可能是另一个actor,比如,QueueClient它将通知请求发送到消息代理,消息将被排队并稍后重播时间。

我如何定义这样一个SupervisorStrategy内置的容错/演员备份?请显示代码示例,这是我学习的唯一方法!

4

1 回答 1

1

覆盖默认指令之外的主管策略通常不会完成,在您的情况下也不是真正必要的。一个解决方案是从父母那里观察孩子演员,当父母发现孩子被阻止时,让备用演员参与。

导入 akka.actor.SupervisorStrategy.Stop 导入 akka.actor._

class Parent extends Actor {

  var child: ActorRef = context.actorOf(Props[DefaultChild])
  context.watch(child)

  def receive = {
    case Terminated(actor) if actor == child => 
      child = context.actorOf(Props[BackupChild])
  }

  override def supervisorStrategy = OneForOneStrategy() {
    case ex: IllegalStateException => Stop
  }
}

class DefaultChild extends Actor {

  def receive = { case _ => throw new IllegalStateException("whatever") }
}

class BackupChild extends Actor {

  def receive = { case _ => }
}
于 2015-07-27T11:21:54.200 回答