1. 在使用 akka cluster singleton 时,我需要知道被创建的 singleton proxy 的 actorRef,通过绝对路径加 actorSelection 方法,应该很容易得到此 actor 的 actorRef
main() { system.actorOf(ClusterSingletonManager.props(Master.props(Duration(99, "second")), "active", PoisonPill, None), "master") context.system.actorSelection("user/master/active").resolveOne(4 second).await ! ParentGreeting }
上面的程序会报异常,actor not found
但是对于普通的 actor,却没有问题
val actorRef: ActorRef = system.actorOf(Master.props(10 second), "standalone") actorRef ! ParentGreetings
不知道原因
2.
对于1,我们假设 singleton actor 已经被创建,在 actor 内部获取自己的 actorRef
val core1: ActorRef = context.system.actorSelection("/user/master").resolveOne(Duration(10, "second")).await val core2: ActorRef = context.system.actorSelection("/user/master/active").resolveOne(Duration(10, "second")).await
core1 成功得到(core1 是 clusterSingletonManager),core2 报错
3.
resolveOne 返回的是 Future[ActorRef],那么在 actor 内部尝试异步的方法
context.system.actorSelection("user/master/active").resolveOne(4 second).map(actor => actor ! ParentGreetings)
成功得到 actorRef 并且发送消息
解释:
对于2,3 我觉得可以理解成,resolveOne() 发送的 activity 消息给 singleton actor 后阻塞在那里,此次阻塞的不仅是这个语句,actor 自己也被阻塞了,它无法给自己再发一个消息,告诉自己的 activityId 信息,因此 resolveOne.await 等待 4 秒后,超时异常,actor not found 异常。
这种解释或许有道理,但是我觉得可能是错的,首先,我用的是 context.system,而不是 context 阻塞的应该不是当前 actor,曾经在stackoverflow 上看到过这个问题。其次,main 里的 resolveOne.await 总不会阻塞 actor 了吧,但它依然没有找到