1

我有一个演员,它充当主管,但还需要将数据“返回”给调用者,这是否是演员无关紧要。

我在问我的主管,我们称他为 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)
    ...
}

这一切都很好。问题是当孩子抛出异常时,这个异常被主管策略捕获。

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

sender 不再是对首先调用 SV 的人的引用,而且我似乎无法弄清楚如何将消息发送回被询问者,并回到我原来的流程。

4

2 回答 2

3

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

于 2015-12-09T07:30:44.863 回答
1

您是否使用主管策略和异常来控制流程或您的数据?考虑使用类型系统(响应中的Optiontype 或 a )来处理子actor中的“异常”情况,并无例外地处理响应流。FailureFuture

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

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

于 2015-12-09T10:55:21.887 回答