Акка разница между actorSelection и resolActorRef

Я использую два разных способа для получения одного и того же результата, но в одном мне нужно указать время обратного вызова, почему? Им доза одних и тех же вещей?

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

1 ответ

Решение

Наиболее очевидная разница, вероятно, в том, что ActorSelection может представлять несколько ActorRefs, если вы используете подстановочные знаки в пути актера. Так что если вы просто позвоните .tell на ваше actorSelection вместо resolveOne Вы доставляете сообщение всем соответствующим актерам.

Я никогда не пользовалась resolveActorRef но из того, что я могу видеть из источников ( ActorRefProvider и ActorSelection) ActorRefProvider использования getChild на rootGuardian чтобы найти это Actor вы ищете и, следовательно, перемещаетесь от вершины вашего дерева актеров вниз, пока он не найдет его в конце концов (или нет).

ActorSelection пытается отправить Identify с помощью шаблона запроса (следовательно, тайм-аута) для выбора, и если он получит ответ, он предоставит ActorRef от которого он получил ответ.

resolveActorRef кажется, будет использоваться, если вы напишите свой собственный сериализатор: Akka Docs, поэтому, если вы просто хотите разрешить актера, я бы пошел с ActorSelection (который, между прочим, вам не нужно разрешать, чтобы отправить ему сообщение).

Другие вопросы по тегам