我是Akka的新手,但我对<{1}}指令的理解是在Stop
内部使用它时,应该认为孩子永久停止服务,但是有一种方法可以解决总停机问题。
如果这种理解是正确的,那么我想要做的是拥有某种“备用演员”,应该在正常/主要孩子被停止后使用,并从那一点开始作为后备使用。例如,假设我有一个拥有儿童演员的父演员 - SupervisorStrategies
- 他的工作就是发送电子邮件。如果Notifier
真正死亡(例如,底层邮件服务器脱机),则此actor的备份可能是另一个actor,例如Notifier
,它将通知请求发送到消息代理,其中消息将排队等待,并在以后重播。
如何定义这样的QueueClient
以在其中内置容错/ actor备份?请展示代码示例,这是我学习的唯一方法!
答案 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 _ => }
}