2015-10-14 60 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 
    } 
}