scala – 如何与它的包装器一起构造一个actor?
发布时间:2020-12-16 09:58:54 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个名为ActorManager的actor,它包含另一个名为RealActor的actor.想法是ActorManager可以处理进出RealActor的所有消息,允许添加其他逻辑,如过滤或缓冲.外部世界应该只通过其经理与RealActor进行通信,就像在现实世界中一样. 初稿看起来像这样:
我正在尝试编写一个名为ActorManager的actor,它包含另一个名为RealActor的actor.想法是ActorManager可以处理进出RealActor的所有消息,允许添加其他逻辑,如过滤或缓冲.外部世界应该只通过其经理与RealActor进行通信,就像在现实世界中一样.
初稿看起来像这样: class ActorManager(realActor: ActorRef) extends Actor { def receive = { case _ => { /* pre-process messages */ } } } class RealActor(actorManager: ActorRef) extends Actor { def receive = { case _ => { /* actual business logic */ } } } 然而,这提出了如何同时构建两个actor,或者更具体地说如何在给定两个actor的循环依赖性的情况下定义相应的Props的问题.在定义道具时我不确定general 我还想避免先构建两个中的一个,然后引入一个显式的Register协议来连接它们. 解决方法
通过使用actor层次结构而不是普通的actor兄弟,可以更好地解决这种情况.由于这里的主要目的是将RealActor隐藏在外部世界中,因此更有意义的是它的ActorRef相应地由外部ActorManager包装/拥有.
这意味着必须在ActorManager范围内创建RealActor引用.这可以通过传递父亲一个ActorRef =>来实现.道具功能,允许创建子actor: // Parent class ActorManager(getRealActorProps: ActorRef => Props) extends Actor { val realActor = context.actorOf(getRealActorProps(self)) def receive = { case _ => { /* pre-process messages */ } } } // Child class RealActor(actorManager: ActorRef) extends Actor { def receive = { case _ => { /* actual business logic */ } } } object RealActor { def propsActorManager(getRealActorProps: ActorRef => Props) = Props(new ActorManager(getRealActorProps)) def propsRealActor(actorManager: ActorRef) = Props(new RealActor(actorManager)) def props() = Props(new ActorManager(actorManager => propsRealActor(actorManager))) } 请注意,现在甚至可以通过提供适当的道具定义来隐藏RealActor被包装的事实,该定义构建了ActorManager – > RealActor层次结构隐式. 另请参阅this blog post为什么平面actor层次结构被视为反模式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |