Akka和Supervisor策略的后备

时间:2015-07-27 10:02:33

标签: akka supervisor

我是Akka的新手,但我对<{1}}指令的理解是在Stop内部使用它时,应该认为孩子永久停止服务,但是有一种方法可以解决总停机问题。

如果这种理解是正确的,那么我想要做的是拥有某种“备用演员”,应该在正常/主要孩子被停止后使用,并从那一点开始作为后备使用。例如,假设我有一个拥有儿童演员的父演员 - SupervisorStrategies - 他的工作就是发送电子邮件。如果Notifier真正死亡(例如,底层邮件服务器脱机),则此actor的备份可能是另一个actor,例如Notifier,它将通知请求发送到消息代理,其中消息将排队等待,并在以后重播。

如何定义这样的QueueClient以在其中内置容错/ actor备份?请展示代码示例,这是我学习的唯一方法!

1 个答案:

答案 0 :(得分:1)

超越默认指令的覆盖主管策略通常不会完成,在您的情况下并非真正必要。解决方案是从父级中观察子actor,当父级发现子级已停止时,请使用备份actor。

导入akka.actor.SupervisorStrategy.Stop     import 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 _ => }
}