我使用两种不同的方法来获得相同的结果,但是我需要指定一个回叫时间,为什么?
他们剂量相同的东西吗?
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
。因此,如果仅在.tell
上调用actorSelection
而不是resolveOne
,则会将消息传递给所有匹配的参与者。
我从未使用过resolveActorRef
,但是从资料来源(ActorRefProvider和ActorSelection)中可以看到,ActorRefProvider
在getChild
上使用rootGuardian
来查找您要查找的Actor
,因此遍历直到您最终(或没有找到)演员树的顶部为止。ActorSelection
尝试使用询问模式(因此超时)向选择内容发送Identify
消息,如果它收到响应,它将提供从中获得响应的ActorRef
。
如果您编写自己的序列化程序,则使用resolveActorRef
:Akka Docs,因此,如果您只想解析一个actor,我会选择ActorSelection
(顺便说一句,您不必解析即可)向其发送消息)。