【问题标题】:Akka and Supervisor Strategies that fallback回退的 Akka 和主管策略
【发布时间】:2015-07-27 10:02:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: akka akka-supervision


    【解决方案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 _ => }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2012-11-06
      • 2015-11-14
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多