在失败的情况下从主管发回发件人

Sending back to sender, from supervisor, in case of failure

我有一个 Actor,它充当 Supervisor,但也需要 "return" 数据给调用者,这是否是一个 actor 应该无关紧要。

我问我的主管,我们称他为 SV。

SV 处理我发给他的消息,并发回回复。

val system = ActorSystem("ActorSystem")
val sv = system.actorOf(Props[SV], name = "SV")

sv ? msg

SV 的接收方法如下所示:

def receive = {
    case msg => (someChild ? msg).pipeTo(sender)
    ...
}

这一切都很好。 问题是当child抛出一个异常,这个异常被supervisor strategy捕获了。

override def supervisorStrategy = OneForOneStrategy () {
    case e : Throwable => {
        val newResponse = someNewResponse
        sender ! newResponse
        ...
    }
}

发件人不再是对最初调用 SV 的人的引用,我似乎无法弄清楚如何将消息发回被询问者,并返回到我的原始流程。

三个 Actor 规则之一是:“一个 Actor 可以向它认识的其他 Actor 发送有限数量的消息。”最后两个词在这里很关键:如果监管者没有以某种方式被介绍给原始发送者并且失败(异常)本身也不包含发送者的引用,那么监管者就不可能向发送者发送消息。要么在子 actor 中捕获所有异常,将它们与发送者一起包装在您自己的异常类型中,然后重新抛出,要么原始消息需要通过 supervisor 传递给 child 并返回,以便 supervisor 可以看到回复发生故障时突出。

您是否正在使用主管策略和异常来控制流程或您的数据?考虑使用类型系统(Option 类型或响应 Future 上的 Failure)用于子 actor 中的 "exception" 个案例,并无一例外地处理响应流。

主管策略用于未处理的异常。 当发生未处理的异常时,您将失去向发件人响应消息的能力。除非像 Roland Kuhn 建议的那样将发件人包装在未处理的异常中。

让主管策略来处理 actor 系统应该如何响应您未处理的异常,方法是将它们映射到 Directive