Исполнительский поиск актера с Akka actorFor - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующий актер Akka:

public class MyActor extends AbstractActor {
  protected Logger log = LoggerFactory.getLogger(this.getClass());

  @Override
  public Receive createReceive() {
      return receiveBuilder()
          .matchAny(message -> {

            String myFullName = self().path().toString();
            String myName = self().path().name();
            ActorRef reincarnatedMe = context().actorFor(self().path().name());
            String reincarnatedFullName = reincarnatedMe.path().toString();
            String reincarnatedName = reincarnatedMe.path().name();

            log.info("myFullName: {}", myFullName);
            log.info("myName: {}", myName);
            log.info("reincarnatedFullName: {}", reincarnatedFullName);
            log.info("reincarnatedName: {}", reincarnatedName);

          }).build();
  }
}

Во время выполнения он производит такой вывод:

05:43:14.617 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - myFullName: akka://MySystem/user/MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - myName: MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - reincarnatedFullName: akka://MySystem/user/MyActor/MyActor
05:43:14.623 [MySystem-akka.actor.default-dispatcher-4] INFO myapp.actors.MyActor - reincarnatedName: MyActor

Мое понимание было, что context().actorFor(...) не делает 't создает новый актер, скорее он находит существующий актер, который соответствует указанному вами пути / строке, и возвращает ссылку на него.

Однако, похоже, что в моем коде выше, self() становится родителем из reincarnatedMe, о чем свидетельствует myFullName просто "MySystem/user/MyActor", тогда как reincarnatedFullName это "MySystem/user/MyActor/MyActor" ...

Я читаюэто право?Если да, то как я могу вызвать context().actorFor(...) (или любой другой метод в этом отношении), чтобы myFullName стал таким же, как reincarnatedFullName (чтобы self() и reincarnatedMe ссылались на одного и того же актера? И если я 'Я не правильно понимаю, почему myFullName отличается от reincarnatedFullName?


Обновление:

public class AnotherActor extends AbstractActor { ... }

// Inside MyActor#createReceive:
ActorSelection anotherActorSel = context().actorSelection("AnotherActor");

anotherActorSel.tell(new SomeMessage(), self());

1 Ответ

0 голосов
/ 20 ноября 2018

Во-первых, ActorContext.actorFor(String) устарела в пользу ActorContext.actorSelection(String).Этот метод возвращает ActorSelection, но вы все равно можете отправить сообщение ActorSelection (например, Identify, ответ на который с сообщением ActorIdentity автоматически).

В документации по методу actorFor сказано, что "AbsoluteURI, такие как akka: // appname / user / actorA, ищутся, как описано для поиска с помощью actorOf (ActorPath). "Я не могу найти документацию по методу actorOf(ActorPath), но другие методы actorOf утверждают, что они создают новых акторов, поэтому я подозреваю, что это делает то же самое.Поведение, которое вы обнаружили, скорее всего, является причиной устаревания - или потому, что оно устарело и методы используются для чего-то другого.

...