假设我有以下简单模型:一个顶级参与者(例如 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 (注意)您可以获得发送参与者的引用。

<小时 />

备注:

另一种选择是编写一个包含所有所需信息的自定义异常,然后抛出该异常而不是默认异常。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!