gpt4 book ai didi

java - 如何将Akka的监督策略与更具体的不可恢复错误处理结合起来?

转载 作者:行者123 更新时间:2023-12-02 12:46:25 41 4
gpt4 key购买 nike

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

<小时/>

备注:

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

关于java - 如何将Akka的监督策略与更具体的不可恢复错误处理结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759928/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com