IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Patterns.ask 是使用一个临时创建的actor发消息而非自身

    hongjiang发表于 2015-09-22 08:07:34
    love 0

    用ask发消息给另一个actor时,在接收方收到消息时对发送者做了watch,但发现并不是目标actor,而是一个临时的actor: Actor[akka://AkkaActorSystem/temp/$a]

    发送者actor里的逻辑:

    val f = targetActor ? Register
    Await.result(f, timeout.duration)
    

    接收者actor里的逻辑:

    case Register => {
      this.observable = sender
      watch(sender)
      become(...)
    }
    

    后来发现这个是因为ask模式就这么设计的,它使用一个临时创建的actor来转发消息并等待对方返回。

    跟踪到ask方法内部,是创建了一个PromiseActorRef:

    val a = new PromiseActorRef(provider, result)产生了一个临时的Actor[akka://AkkaActorSystem/temp/$a] 被用来代替当前actor发送消息给目标,当它接收到目标回应的结果后,会被卸载掉。



沪ICP备19023445号-2号
友情链接