加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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 lazy val pattern是否适用.

我还想避免先构建两个中的一个,然后引入一个显式的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层次结构被视为反模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读