2015-11-27 42 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