我有一名演员,担任主管,但也需要"返回"数据给调用者,这是一个演员与否应该不重要。
我问我的主管,让我们称他为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,并回到原来的流程。
答案 0 :(得分:3)
三个Actor规则中的一个是:“一个Actor可以向其知道的其他Actors发送有限数量的消息。”最后两个字在这里是至关重要的:如果主管没有以某种方式介绍给原始发送者而且失败(异常)本身也不包含发送者的引用,然后主管不可能向发送者发送消息。您可以捕获子actor中的所有异常,将它们与发件人一起包装在您自己的异常类型中然后重新抛出,或者原始消息需要通过主管传递给孩子并返回,以便主管可以看到回复在发生故障时非常出色。
答案 1 :(得分:1)
您是否使用主管策略和例外来控制流量或数据?考虑在您的子actor中使用类型系统(Option
类型或响应Failure
上的Future
)来处理“异常”情况,并且无异常地处理响应流。
主管策略适用于未处理的异常。 当发生未处理的异常时,您将无法通过向发件人发送消息进行响应。除非你将发件人包裹在Roland Kuhn建议的未处理的例外中。
让主管策略改为处理actor系统如何通过将它们映射到Directive
来响应未处理的异常。