2012-05-18 36 views
1

Im新的AKKA2.The以下是我的問題:如何檢測死亡的遠程客戶端或服務器在akka2

有一個服務器的演員和幾個客戶端演員。 服務器存儲客戶端參與者的所有參考。

我不知道服務器如何可以檢測該客戶端斷開連接(關機,死機......)

,如果有一種方法來告訴客戶端服務器已經死了。

回答

2

有兩種方式與角色的生命週期進行交互。首先,行爲者的父母定義了一個處理參與者失敗的監督政策,並且可以選擇在失敗後重新啓動,停止,恢復或升級。另外,非監督者演員可以「觀看」演員來檢測演員死亡時產生的終止消息。本文檔的這一部分涵蓋以下主題:http://doc.akka.io/docs/akka/2.0.1/general/supervision.html

下面是使用規格表的示例。我開始一個演員,然後成立了一個觀衆終端。當演員獲得一個PoisonPill消息,由觀察者檢測到事件:

"be able to watch the proxy actor fail" in { 
     val myProxy = system.actorOf(Props(new VcdRouterActor(vcdPrivateApiUrl, vcdUser, vcdPass, true, sessionTimeout)), "vcd-router-" + newUuid) 
     watch(myProxy) 
     myProxy ! PoisonPill 
     expectMsg(Terminated(`myProxy`)) 
} 

下面是停止兒童演員,如果它失敗的自定義主管戰略的一個例子,由於認證例外,因爲這可能不會糾正的,或者升級失敗到一個更高的上司,如果故障是另一個原因:

override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 1 minutes) { 

    // presumably we had a connection, and lost it. Let's restart the child and see if we can re-establish one. 
    case e: AuthenticationException ⇒ 
     log.error(e.message + " Stopping proxy router for this host") 
     Stop 

    // don't know what it was, escalate it. 
    case e: Exception ⇒ 
     log.warning("Unknown exception from vCD proxy. Escalating a {}", e.getClass.getName) 
     Escalate 
} 

在一個演員,你可以通過拋出異常或處理一個PoisonPill消息產生的故障。

如果您不想生成故障,另一種可能有用的模式是對發件人進行故障回覆。然後,您可以與來電者進行更多的個人信息交換。例如,調用者可以使用ask模式並使用onComplete塊來處理響應。主叫方:

vcdRouter ? DisableOrg(id) mapTo manifest[VcdHttpResponse] onComplete { 
     case Left(failure) => log.info("receive a failure message") 
     case Right(success) ⇒ log.info("org disabled)  
} 

被叫方:

val org0 = new UUID("00000000-0000-0000-0000-000000000000") 
def receive = { 
    case DisableOrg(id: UUID) if id == org0 => sender ! Failure(new IllegalArgumentException("can't disable org 0") 
    case DisableOrg(id: UUID) => sender ! disableOrg(id) 
} 
+0

我不明白你的答案。問題很簡單。我有一個遠程演員R.從一個當地演員L,我稱之爲手錶(R)。當R死亡時,會通知L嗎? –

1

爲了讓您的服務器反應的遠程客戶端狀態的變化,你可以使用類似以下內容(例如是阿卡2.1.4)。

在Java

@Override 
public void preStart() { 
    context().system().eventStream().subscribe(getSelf(), RemoteLifeCycleEvent.class); 
} 

或者在斯卡拉

override def preStart = { 
    context.system.eventStream.subscribe(listener, classOf[RemoteLifeCycleEvent]) 
} 

如果你只當客戶端斷開連接,你可以只爲RemoteClientDisconnected

更多信息here(java)here(scala)

登記興趣
1

在即將推出的Akka 2.2版本(RC1昨天發佈),Death Watch可在本地和遠程使用。如果您在另一個系統上觀察根監護人,當您終止他時,您知道遠程系統已關閉。

希望有幫助!

相關問題