Scala 在发生故障时,从主管发回发送方

Scala 在发生故障时,从主管发回发送方,scala,akka,akka-supervision,Scala,Akka,Akka Supervision,我有一个演员,它充当主管,但也需要向调用者“返回”数据,不管这是不是演员都不重要 我在问我的主管,我们叫他SV吧 SV处理我发送给他的消息,并返回响应 val system = ActorSystem("ActorSystem") val sv = system.actorOf(Props[SV], name = "SV") sv ? msg SV的Receive方法如下所示: def receive = { case msg => (someChild ? msg).pipe

我有一个演员,它充当主管,但也需要向调用者“返回”数据,不管这是不是演员都不重要

我在问我的主管,我们叫他SV吧

SV处理我发送给他的消息,并返回响应

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

sv ? msg
SV的Receive方法如下所示:

def receive = {
    case msg => (someChild ? msg).pipeTo(sender)
    ...
}
这一切都很好。 问题是,当孩子抛出异常时,该异常会被主管策略捕获

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

sender不再是一开始调用SV的人的参考,我似乎不知道如何将消息发送回askee,并返回到我的原始流程。

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

三个参与者规则之一是:“一个参与者可以向它知道的其他参与者发送有限数量的消息。”最后两个词在这里很关键:如果主管没有以某种方式介绍给原始发送者,那么失败(例外)它本身也不包含发件人的引用,因此主管不可能向发件人发送消息。要么捕获子参与者中的所有异常,将它们与发件人一起包装在自己的异常类型中,然后重新播放,要么原始消息需要通过主管传递到子参与者,然后返回,以便当发生故障时,监控器可以看到答复是突出的。

< P>您是否使用监督者策略和异常来控制流程或数据?请考虑使用“异常”类型系统(<代码>选项>代码>类型或“<代码>失败/ <代码>在响应<代码>将来<代码> >中的“异常”)。您的子参与者中的案例,并处理响应流,没有例外

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


让监督者策略来处理演员系统应该如何应对未处理的异常,将其映射到<代码>指令< /代码> .< /p> < p>是否使用监督者策略和异常来控制流程或数据?请考虑使用类型系统。(

选项
在响应未来中键入一个
失败
),用于子参与者中的“异常”情况,并在没有异常的情况下处理响应流

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


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

我不确定我是否理解,“原始消息需要通过主管传递给孩子并返回”,当我从主管处询问孩子时,这不是我正在做的吗?它不会直接返回到我询问的地方,因为发生了异常,所以会点击主管策略。现在,我想从这里向原始发件人发送一条消息(来自主管),有不同的回答,如果我的问题仍然不够清楚,我可以在需要时用流程图更新。啊,对了,我没有正确解析
ask
的用法;是的,这就是我的意思。然后在制定主管策略时,你仍然需要在主管中捕获原始的
发送者
意味着管理未完成请求的数量(以免混淆)。我不确定我是否理解,“原始消息需要通过主管传递给孩子并返回”,当我从主管处询问孩子时,这不是我正在做的吗?它不会直接返回到我询问的地方,因为发生了异常,所以会点击主管策略。现在,我想从这里向原始发件人发送一条消息(来自主管),有不同的回答,如果我的问题仍然不够清楚,我可以在需要时用流程图更新。啊,对了,我没有正确解析
ask
的用法;是的,这就是我的意思。然后在制定主管策略时,你仍然需要在主管中捕获原始的
发送者
意味着管理未完成请求的数量(以免混淆)。