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吗? –