2015-11-24 96 views
3

我在管理監督方面存在問題。Akka模型監督

假設我有演員A創建演員B並向他發送消息。

val B = context.actorOf(Props[B],"B") 
B ! RandomMessage(param1, param2) 

B做這樣的計算或要求遠程服務。基本上它可能會失敗,異常。

override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false) { 
case exception:NetworkException => { 
    Restart 
    // here I don't have access to param1 and param2 to send message again 
} 

}

它工作正常,因爲兒童演員重新啓動,但如果我要重試此失敗的消息是什麼。我怎樣才能做到這一點 ?

回答

6

該消息有preRestart

override def preRestart(reason: Throwable, message: Option[Any]) = { 
    self ! message.get 
    //to continue default behavior. ie, to restart all child actors 
    //you could even manage how you deal with your child actor here instead of calling super.preRestart 
    super.preRestart(reason, message) 
} 

確保您配置監控策略,使其不會陷入無限循環。

EDIT

如@Viktor巴生所提到的,不使用Option#get改用Option#getOrElse和處理奇數的情況。

+0

我可以使用preRestart,但是我必須將消息:Option [Any]轉換爲我的命令類型。現在我只有一個命令,但後來我可能會添加更多,並可能有問題 – Axpom

+0

我猜你已經在'receive'方法中使用模式匹配來處理消息。對於來自preRestart的消息也是一樣。只要確保使用'Option#get',而不是發送選項本身。 – 757071

+1

做*不*使用Option.get,這是一個選項,它並不總是可用的原因。 –