检测远程akka连接错误

时间:2015-11-27 09:36:08

标签: akka akka-remote-actor

我的项目包含两部分 - 一部分是akka服务器,另一部分是play框架。两者有时可以重新启动。为了从akka服务器接收日志记录,我正在使用Websocket处理程序

  def ws = WebSocket.acceptWithActor[JsValue, JsValue] { request => out =>
    CheckerActor.props(out)
  }

与actor订阅某些远程actor的更改。

class CheckerActor(out: ActorRef) extends Actor {
...
  override def preStart() = {
    context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Subscribe()
  }

  override def postStop() {
    context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Unsubscribe()
  }

  def receive = {
    case msg: LogMessage => out ! Json.toJson(msg)
...
  }
}

远程记录器actor对subscribe()unsubscribe()事件做出反应,并向订阅的客户端发送日志消息。它工作正常,直到远程服务器不挂起或刚刚重新启动。什么是最便宜的方法来检测远程akka服务器断开连接(之后我可以再次订阅新的启动记录器)。我可以建立一些pinger演员,如果我收到超时而不是尝试再次重新订阅,但简单的ping不能保证重启已经发生在他们之间,他们使系统更复杂。可能存在其他解决方案。

1 个答案:

答案 0 :(得分:2)

您可以像观看当地演员一样观看远程演员。在内部Akka使用心跳消息来检查终止,我认为这与您的ping'理念。

收听Terminated消息将涵盖远程演员失败的事件,但我不确定这是否包括断开连接事件。为此,您可以订阅DisassociatedEvent

查看Akka文档中的远程事件部分: http://doc.akka.io/docs/akka/snapshot/scala/remoting.html