如果发生故障,从主管发回发件人

时间:2015-12-08 12:38:20

标签: scala akka akka-supervision

我有一名演员,担任主管,但也需要"返回"数据给调用者,这是一个演员与否应该不重要。

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

发件人不再是对首先调用SV的人的引用,我似乎无法解决如何将消息发送回askee,并回到原来的流程。

2 个答案:

答案 0 :(得分:3)

三个Actor规则中的一个是:“一个Actor可以向其知道的其他Actors发送有限数量的消息。”最后两个字在这里是至关重要的:如果主管没有以某种方式介绍给原始发送者而且失败(异常)本身也不包含发送者的引用,然后主管不可能向发送者发送消息。您可以捕获子actor中的所有异常,将它们与发件人一起包装在您自己的异常类型中然后重新抛出,或者原始消息需要通过主管传递给孩子并返回,以便主管可以看到回复在发生故障时非常出色。

答案 1 :(得分:1)

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

主管策略适用于未处理的异常。 当发生未处理的异常时,您将无法通过向发件人发送消息进行响应。除非你将发件人包裹在Roland Kuhn建议的未处理的例外中。

让主管策略改为处理actor系统如何通过将它们映射到Directive来响应未处理的异常。