说我有以下简单模型:一个上层演员(例如ReportService
(接受慢速异步操作的请求,并使用许多委托参与者来执行失败parther-prone。子任务,遵循错误内核模式。
子任务将从数据库中检索数据,以产生报告文件,以在某个地方的文件存储上发布文件。
当最高请求任务之一完成时,我希望ReportService
Actor通知请求用户的完成。
到目前为止,这一切都非常适合我对演员模型的理解,但是我不明白如何优雅地处理不可恢复的失败案例。所有监督策略等都很清楚,但是如果重新恢复后无法完成请求,我该如何向用户发送通知,详细说明发生的特定错误?
例如,如果我用完了磁盘空间,那么我无能为力恢复。我希望ReportService
能够识别该操作在此特定阶段失败,并将通知解释给用户。我目前的解决方案是手动将错误包裹在儿童演员中,并基本上发送Either
类型消息,但这似乎不太适合"让它崩溃"理念。
tl; dr:是否有一种方法可以访问导致子演员在父亲演员中失败的可投掷,目的是将其转发到其他地方?
您可以访问母公司内部的监督策略实施中的可投掷(来自Akka Docs(:
val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: ArithmeticException => Resume
case _: NullPointerException => Restart
case _: IllegalArgumentException => Stop
case _: Exception => Escalate
}
编辑
在您的情况下,您可以做这样的事情:
val supervisorStrategy =
AllForOneStrategy {
case e: Throwable =>
notifyUser(e)
Stop
}
编辑2响应评论
根据文档(注(,您可以获得对发送演员的参考。
备注:
另一个选项是用所有必要的信息编写自定义异常,然后将其抛出而不是默认异常。