actorSelection 和 resolveActorRef 之间的 Akka 区别

Akka difference between actorSelection and resolveActorRef

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

    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();

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

我从未使用过 resolveActorRef 但从我从来源 (ActorRefProvider and ActorSelection) 中看到的情况来看 ActorRefProviderrootGuardian 上使用 getChild 发现Actor 你正在寻找,因此从你的演员树的顶部向下遍历,直到他最终(或没有)找到它。

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

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