我正在尝试编写一个名为的演员ActorManager
,该演员包装了另一个名为的演员RealActor
。这个想法是,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 */ }
}
}
但是,这提出了一个问题,即如何一次构造两个参与者,或更具体地讲,在Props
给定两个参与者的循环依赖关系的情况下,如何定义对应的参与者。我不确定在定义时一般lazy val
模式是否适用Props
。
我还想避免先构建两个方法之一,再引入显式Register
协议连接它们的方法。
通过使用actor层次结构而不是普通actor兄弟姐妹,可以更好地解决这种情况。由于此处的主要目的是RealActor
将外界隐藏起来,因此将其ActorRef
相应地由外部包装/拥有更为有意义ActorManager
。
这意味着RealActor
必须在范围内创建引用ActorManager
。这可以通过向父级传递一个ActorRef => Props
函数来实现,以创建子级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
通过提供适当的props
定义来隐藏事实,即通过ActorManager -> RealActor
隐式构建层次结构的适当定义。
另请参阅此博客文章,为什么将平面actor层次结构视为反模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句