用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发送消息给目标,当它接收到目标回应的结果后,会被卸载掉。