我是AKKA2的新手。以下是我的问题:
有一个服务器角色和几个客户角色。 服务器存储客户端actor的所有引用。
我想知道服务器如何检测哪个客户端断开连接(关机,崩溃......)
如果有办法告诉客户服务器已经死了。
答案 0 :(得分:2)
有两种方式可以与演员的生命周期进行交互。首先,actor的父级定义了一个处理actor失败的监督策略,并且可以选择在失败后重新启动,停止,恢复或升级。此外,非主管演员可以“观察”演员以检测演员死亡时生成的终止消息。本部分文档涵盖了主题: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`))
}
这是一个自定义管理程序策略的示例,如果由于身份验证异常导致其失败,则停止子actor,因为这可能无法更正,或者如果失败是由于其他原因,则将失败升级为更高的管理员:
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
}
在actor中,您可以通过抛出异常或处理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)
}
答案 1 :(得分:1)
为了使您的服务器对远程客户端状态的更改做出反应,您可以使用类似下面的内容(示例适用于Akka 2.1.4)。
在Java中
@Override
public void preStart() {
context().system().eventStream().subscribe(getSelf(), RemoteLifeCycleEvent.class);
}
或者在Scala中
override def preStart = {
context.system.eventStream.subscribe(listener, classOf[RemoteLifeCycleEvent])
}
如果您只对客户端断开连接感兴趣,则只能注册RemoteClientDisconnected
答案 2 :(得分:1)
在即将发布的Akka 2.2版本(RC1于昨天发布)中,Death Watch可在本地和远程工作。如果您在另一个系统上观看根监护人,当您为他终止时,您知道远程系统已关闭。
希望有所帮助!