2014-01-15 55 views
1

我是Akka的新手。我建立了一個Akka集羣。在集羣中,我有一個節點作爲主節點,它將工作分配給從節點。主節點將首先啓動。然後,從節點將把這些資源註冊到主機。如果奴隸正常離開,主人將收到一條消息在羣集中處理墜毀的遠程演員

message instanceof Terminated 

然後主人會爲從節點做一些恢復。但是,如果奴隸崩潰,我該如何處理它。目前,控制檯將打印錯誤爲「連接被拒絕」。任何人都可以告訴我如何捕獲這個錯誤,並知道這個崩潰的從機的ActorRef,這樣主機會爲崩潰的從機節點做類似的恢復。

非常感謝您

回答

1

您可以維護其他節點的地址與對應的ActorRef-S(或演員路徑)對他們的列表(或地圖)。您可以訂閱羣集消息(如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) 
    } 

} 
+0

謝謝我試過了。非常有用〜 – user3034824

1

在Cluster文檔:

「死亡手錶使用羣集故障檢測器,用於節點的集羣中的,即,其產生從網絡故障終止消息和JVM崩潰,除了優雅地終止觀看的演員。「 - http://doc.akka.io/docs/akka/2.2.3/scala/cluster-usage.html

+2

死亡手錶只能檢測到優雅的死亡。如果節點變得無法訪問,看起來死亡腕錶無法檢測到它 – user3034824

+1

如果您使用的是Akka 2.2或更高版本,則不適用。 –