2012-05-18 28 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可在本地和远程使用。如果您在另一个系统上观察根监护人,当您终止他时,您知道远程系统已关闭。

希望有帮助!

相关问题