1

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

    ActorRef resolveActorRef = getContext().getSystem()
                .provider() .resolveActorRef(ActorPath.fromString("akka://RootRemoteActors/user/$a/remote.actors.AA"));

上面的代码无需等待任何时间即可检索演员 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();
4

1 回答 1

1

最明显的区别可能是如果在actor路径中使用通配符,anActorSelection可以表示多个s。ActorRef因此,如果您只是调用.tell您的actorSelection而不是resolveOne您将消息传递给所有匹配的参与者。

我从未使用过resolveActorRef,但从我可以从源代码(ActorRefProviderActorSelectionActorRefProvider中看到getChildrootGuardian用于查找Actor您正在寻找的内容,因此从您的演员树的顶部向下遍历,直到他最终(或没有)找到它。

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

resolveActorRef如果您编写自己的序列化程序似乎可以使用:Akka Docs,所以如果您只想解析一个演员,我会选择ActorSelection(顺便说一句,您不必为了向它发送消息而解析)。

于 2017-06-26T11:45:02.273 回答