我使用两种不同的方法来获得相同的结果,但是我需要指定一个回叫时间,为什么?
他们剂量相同的东西吗?

    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,但是从资料来源(ActorRefProviderActorSelection)中可以看到,ActorRefProvidergetChild上使用rootGuardian来查找您要查找的Actor,因此遍历直到您最终(或没有找到)演员树的顶部为止。

ActorSelection尝试使用询问模式(因此超时)向选择内容发送Identify消息,如果它收到响应,它将提供从中获得响应的ActorRef

如果您编写自己的序列化程序,则使用resolveActorRefAkka Docs,因此,如果您只想解析一个actor,我会选择ActorSelection(顺便说一句,您不必解析即可)向其发送消息)。

10-08 16:28