假设我有以下简单模型:一个顶级参与者(例如 ReportService
),它接受慢速异步操作的请求并使用多个委托(delegate)参与者来执行容易失败的子操作-任务,遵循错误内核模式。
子任务是从数据库检索数据、生成报告文件、将文件发布到某个文件存储上等。
当顶级请求任务之一完成时,我希望 ReportService 参与者通知请求用户其完成。
到目前为止,这一切都非常符合我对参与者模型的理解,但是我不明白如何优雅地处理不可恢复的失败案例。 监管策略等都很清楚,但如果多次重试后仍无法完成请求,如何向用户发送详细说明发生的具体错误的通知?
例如,如果我的磁盘空间不足,我就无能为力来恢复。我希望 ReportService 能够识别该特定阶段的操作失败并向用户发送解释该情况的通知。我当前的解决方案是将错误手动包装在子参与者中,并基本上发送Either
类型的消息,但这似乎不太符合“让它崩溃”的哲学。
TL;DR:有没有一种方法可以访问导致子 Actor 在父 Actor 中失败并意图将其转发到其他地方的可抛出对象?
请您参考如下方法:
您可以在父 Actor 内的监督策略实现中访问 throwable(来自 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 回应评论
根据Docs (注意)您可以获得发送参与者的引用。
<小时 />备注:
另一种选择是编写一个包含所有所需信息的自定义异常,然后抛出该异常而不是默认异常。