我正在构建一个新的akka应用程序的设计挑战。 问题/挑战是: 在客户端,我创建了一个简单的actor,它发送一个请求,然后使用become()来等待正确的服务器答案,当然还包括一个超时消息,以防我没有得到正确的答案时间。 然而,有趣的是在服务器端。 在这里,我有以下结构:
Actor A(配置为循环路由器)此路由器正在接收来自客户端的所有请求。
演员A然后将消息转发给演员A1,A2 ... Ax,这些都是在演员A的上下文中创建的,这意味着它是他们的主管。
在正常情况下,Actor Ax可以只回复发件人,因为邮件是转发的,但是...... 如果出现错误,我想在服务器日志上记录它,同时也为用户提供有关已发生错误的信息。
在完美的世界中,我更愿意能够以某种方式在主管策略中说出类似getErrorActorsLastSender()的内容,然后获取导致该问题的客户端的ActorRef。我更喜欢这个的原因是,我会有一个地方可以处理所有的错误,并且所有不可见的异常总是至少以某种通用方式处理。
另一种方法是覆盖每个子actor上的prerestart()方法,然后使supervisor策略在抛出异常时重新启动actor。但是,这需要我为x子actor执行此方法。
如果主管策略可以做到这一点,那么有什么好的建议吗?
提前致谢。
答案 0 :(得分:1)
您是否尝试过创建自己的主管策略,例如扩展OneForOneStrategy?有一种名为handleFailure
的方法,它采用(以及其他)儿童和失败的原因。此外,您将获得ActorContext,它会为您提供导致错误的消息的发件人,我认为您应该能够在覆盖此方法时执行您想要的操作。
答案 1 :(得分:0)
实现目标的一种方法是将发件人封装在Exception中。如果您自己抛出异常,这应该是直截了当的。