我使用两种不同的方法来获得相同的结果,但在一种方法中我需要指定回调时间,为什么? 他们服用相同的药物?
ActorRef resolveActorRef = getContext().getSystem()
.provider() .resolveActorRef(ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA"));
上面的代码无需等待即可检索 Actor Ref 为什么如果我没有得到证明者,我必须指定一个持续时间?
ActorSelection actorSelection = getContext().getSystem()
.actorSelection( ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA"));
ActorRef ois = actorSelection.resolveOne( new Timeout(1000, TimeUnit.MILLISECONDS ))
.value().get().get();
最佳答案
最明显的区别可能是,如果您在 actor 路径中使用通配符,一个 ActorSelection
可以表示多个 ActorRef
。因此,如果您只是在 actorSelection
上调用 .tell
而不是 resolveOne
,您就会将消息传递给所有匹配的 actor。
我从未使用过resolveActorRef
,但从来源(ActorRefProvider和ActorSelection)来看,ActorRefProvider
使用getChild
rootGuardian
来查找您正在寻找的 Actor
,因此从您的 Actor 树的顶部向下遍历,直到他最终找到(或找不到)。
ActorSelection
尝试使用询问模式(因此超时)向选择发送一条 Identify
消息,如果收到响应,它将提供 ActorRef
从中获得响应。
resolveActorRef
:Akka Docs ,所以如果您只想解析一个 Actor,我会使用 ActorSelection
(顺便说一句,您不必解析它即可向它发送消息)。
关于java - Akka actorSelection和resolveActorRef之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44757323/