Im新的AKKA2.The以下是我的問題:如何檢測死亡的遠程客戶端或服務器在akka2
有一個服務器的演員和幾個客戶端演員。 服務器存儲客戶端參與者的所有參考。
我不知道服務器如何可以檢測該客戶端斷開連接(關機,死機......)
,如果有一種方法來告訴客戶端服務器已經死了。
Im新的AKKA2.The以下是我的問題:如何檢測死亡的遠程客戶端或服務器在akka2
有一個服務器的演員和幾個客戶端演員。 服務器存儲客戶端參與者的所有參考。
我不知道服務器如何可以檢測該客戶端斷開連接(關機,死機......)
,如果有一種方法來告訴客戶端服務器已經死了。
有兩種方式與角色的生命週期進行交互。首先,行爲者的父母定義了一個處理參與者失敗的監督政策,並且可以選擇在失敗後重新啓動,停止,恢復或升級。另外,非監督者演員可以「觀看」演員來檢測演員死亡時產生的終止消息。本文檔的這一部分涵蓋以下主題: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)
}
爲了讓您的服務器反應的遠程客戶端狀態的變化,你可以使用類似以下內容(例如是阿卡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
登記興趣在即將推出的Akka 2.2版本(RC1昨天發佈),Death Watch可在本地和遠程使用。如果您在另一個系統上觀察根監護人,當您終止他時,您知道遠程系統已關閉。
希望有幫助!
我不明白你的答案。問題很簡單。我有一個遠程演員R.從一個當地演員L,我稱之爲手錶(R)。當R死亡時,會通知L嗎? –