如何在akka2中检测失效的远程客户端或服务器

如何在akka2中检测失效的远程客户端或服务器,akka,Akka,我是AKKA2的新手。以下是我的问题: 有一个服务器参与者和几个客户端参与者。 服务器存储客户端参与者的所有ref 我想知道服务器如何检测哪个客户端断开连接关机、崩溃 如果有办法告诉客户端服务器已死亡。有两种方法可以与参与者的生命周期进行交互。首先,参与者的父级定义了一个管理策略,用于处理参与者故障,并可以选择在故障后重新启动、停止、恢复或升级。此外,非主管参与者可以观察参与者,以检测参与者死亡时生成的终止消息。本节文档涵盖以下主题: 下面是一个使用规范中的watch的示例。我启动一个参与者,然

我是AKKA2的新手。以下是我的问题:

有一个服务器参与者和几个客户端参与者。 服务器存储客户端参与者的所有ref

我想知道服务器如何检测哪个客户端断开连接关机、崩溃


如果有办法告诉客户端服务器已死亡。

有两种方法可以与参与者的生命周期进行交互。首先,参与者的父级定义了一个管理策略,用于处理参与者故障,并可以选择在故障后重新启动、停止、恢复或升级。此外,非主管参与者可以观察参与者,以检测参与者死亡时生成的终止消息。本节文档涵盖以下主题:

下面是一个使用规范中的watch的示例。我启动一个参与者,然后为终止设置一个观察者。当参与者收到毒药信息时,观察者会检测到该事件:

"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
}
在actor中,您可以通过抛出异常或处理中毒丸消息来生成失败

如果您不想生成失败,另一种可能有用的模式是向发送方响应失败。然后,您可以与来电者进行更私人的消息交换。例如,调用方可以使用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)
}

有两种方法可以与参与者的生命周期进行交互。首先,参与者的父级定义了一个管理策略,用于处理参与者故障,并可以选择在故障后重新启动、停止、恢复或升级。此外,非主管参与者可以观察参与者,以检测参与者死亡时生成的终止消息。本节文档涵盖以下主题:

下面是一个使用规范中的watch的示例。我启动一个参与者,然后为终止设置一个观察者。当参与者收到毒药信息时,观察者会检测到该事件:

"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
}
在actor中,您可以通过抛出异常或处理中毒丸消息来生成失败

如果您不想生成失败,另一种可能有用的模式是向发送方响应失败。然后,您可以与来电者进行更私人的消息交换。例如,调用方可以使用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)
}

为了使您的服务器对远程客户端状态的更改做出反应,您可以使用类似以下Akka 2.1.4的示例

在爪哇

@Override
public void preStart() {
    context().system().eventStream().subscribe(getSelf(), RemoteLifeCycleEvent.class);
}
还是在斯卡拉

override def preStart = {
     context.system.eventStream.subscribe(listener, classOf[RemoteLifeCycleEvent])
}
如果您只对客户端断开连接感兴趣,则只能注册RemoteClientDisconnected


更多信息和

为了使您的服务器对远程客户端状态的更改做出反应,您可以使用类似以下Akka 2.1.4的示例

在爪哇

@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中,死亡观察可以在本地和远程工作。如果您观察另一个系统上的根守护者,当您为他终止时,您知道远程系统已关闭


希望有帮助

在昨天发布的即将发布的Akka 2.2版本RC1中,死亡观察可以在本地和远程工作。如果您观察另一个系统上的根守护者,当您为他终止时,您知道远程系统已关闭


希望有帮助

我不明白你的答案。问题很简单。我有一个远程演员R。从一个本地演员L,我叫watchR。R死后会通知我吗?我不明白你的答案。问题很简单。我有一个远程演员R。从一个本地演员L,我叫watchR。R死后会通知我吗?