处理群集中崩溃的远程actor

时间:2014-01-15 10:52:08

标签: akka

我是Akka的新手。我建了一个Akka集群。在集群中,我有一个节点作为主节点,它将工作分配给从节点。首先启动主节点。然后,从节点将把这些节点注册到主节点。如果从属设备优雅,主设备将收到

消息
message instanceof Terminated

然后主设备将为从节点进行一些恢复。但如果奴隶只是坠毁,我该怎么办呢。目前,控制台将错误打印为“连接被拒绝”。任何人都可以告诉我如何捕获此错误并知道此崩溃的从站的ActorRef,以便主站将对崩溃的从属节点执行类似的恢复。

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以使用相应的ActorRef-s(或actor路径)维护其他节点地址的列表(或映射)。您可以订阅群集消息(如UnreachableMember)并在接收时进行一些恢复。

这样的事情:

class ClusterRefRecoverExample extends Actor {

  private val membersWithActorRefs = collection.mutable.HashMap[Address, ActorRef]()

  override def preStart() {
    super.preStart()
    val cluster = Cluster(context.system)
    cluster.subscribe(self, classOf[MemberEvent])
    cluster.subscribe(self, classOf[UnreachableMember])
  }

  override def postStop() {
    super.postStop()
    Cluster(context.system).unsubscribe(self)
  }

  def recoverAddress(addr: Address) {
    membersWithActorRefs.get(addr) foreach {
      theRef =>
        // do your recover here
    }
  }

  def removeAddress(addr: Address) {
    membersWithActorRefs.remove(addr)
  }

  def receive = {

    ....

    case UnreachableMember(member) =>      
      recoverAddress(member.address)

    case MemberRemoved(member, _) =>
      removeAddress(member.address)

    case MemberExited(member) =>
        removeAddress(member.address)
  }

}

答案 1 :(得分:1)

从群集文档:

“死亡监视器使用集群故障检测器来处理集群中的节点,即除了正常终止被监视的演员之外,它还会从网络故障和JVM崩溃中生成终止消息。” - http://doc.akka.io/docs/akka/2.2.3/scala/cluster-usage.html