2015-10-14 64 views
3

當接收演員因該消息而死亡時,我試圖響應消息的發送者。如果我Restart演員失敗我得到捕獲殺死演員的消息

preRestart(reason: Throwable, message: Option[Any]) 

但現在我致力於重新啓動。

如果我Stop演員,我只得到

postStop() 

沒有什麼知識停止自己。

同時在主管,我只得到Throwable,並沒有跡象表明是什麼造成的。

我想,我可以挖掘DeadLetters發佈演員終止,但這似乎是一個嘈雜的方法,因爲我必須聽所有的死信,並在某處將終止與deadletter事件流相關聯。

更新:DeadLetter真的似乎不是一個選項。導致死亡的消息甚至沒有進入DeadLetters,它只是消失。

有沒有我忽略的機制?

回答

0

根據Akka用戶列表上的this thread,在執行者監督死亡週期中沒有一種機制來完成此任務。此外,該文件明確指出,該消息被刪除:

What happens to the Message

如果在被處理的消息(即取出其郵箱,並移交給當前行爲)拋出一個異常,那麼這條消息將會丟失。理解它不會放回郵箱很重要。因此,如果您想重試郵件處理,則需要通過捕獲異常並重試流程來自行處理。

理想的解決方案是使用專用的男演員危險操作,所引發監視演員的死亡以確定故障。

由於我的情況,從一些被認爲安全出現但有存在一個bug,單獨演員的選擇將有事實後一直。爲了避免纏繞在try/catch所有代碼路徑,但能夠防範更爲複雜和重要的流量,我結束了創建receive的包裝,它可以讓我攔截例外:

​​

,我可以使用選擇的演員像這樣:

def receive = SafeReceive { 
    case ... => ... 
} { 
    msg => { 
    case e: Exception => 
     sender ! OperationFailed(msg, e) 
     throw e 
    } 
}