Акка разница между 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
может представлять несколько ActorRef
s, если вы используете подстановочные знаки в пути актера. Так что если вы просто позвоните .tell
на ваше actorSelection
вместо resolveOne
Вы доставляете сообщение всем соответствующим актерам.
Я никогда не пользовалась resolveActorRef
но из того, что я могу видеть из источников ( ActorRefProvider и ActorSelection) ActorRefProvider
использования getChild
на rootGuardian
чтобы найти это Actor
вы ищете и, следовательно, перемещаетесь от вершины вашего дерева актеров вниз, пока он не найдет его в конце концов (или нет).
ActorSelection
пытается отправить Identify
с помощью шаблона запроса (следовательно, тайм-аута) для выбора, и если он получит ответ, он предоставит ActorRef
от которого он получил ответ.
resolveActorRef
кажется, будет использоваться, если вы напишите свой собственный сериализатор: Akka Docs, поэтому, если вы просто хотите разрешить актера, я бы пошел с ActorSelection
(который, между прочим, вам не нужно разрешать, чтобы отправить ему сообщение).