我是Akka的新手。我建了一个Akka集群。在集群中,我有一个节点作为主节点,它将工作分配给从节点。首先启动主节点。然后,从节点将把这些节点注册到主节点。如果从属设备优雅,主设备将收到
消息message instanceof Terminated
然后主设备将为从节点进行一些恢复。但如果奴隶只是坠毁,我该怎么办呢。目前,控制台将错误打印为“连接被拒绝”。任何人都可以告诉我如何捕获此错误并知道此崩溃的从站的ActorRef,以便主站将对崩溃的从属节点执行类似的恢复。
非常感谢
答案 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