2015-11-27 93 views
0

我的项目包含2个部分 - 一个是akka服务器,另一个是播放框架。两者都可以重新启动。从阿卡服务器接收日志我使用的WebSocket处理器检测远程akka连接错误

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

与演员,订阅了一些偏远的演员变化。

class CheckerActor(out: ActorRef) extends Actor { 
... 
    override def preStart() = { 
    context.actorSelection("akka.tcp://[email protected]:2553/user/logger") ! Subscribe() 
    } 

    override def postStop() { 
    context.actorSelection("akka.tcp://[email protected]:2553/user/logger") ! Unsubscribe() 
    } 

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

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

回答

2

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

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

看在阿卡文档远程事件部分: http://doc.akka.io/docs/akka/snapshot/scala/remoting.html

+0

DisassociatedEvent - 这是我期待的。 – Oleg