У меня есть следующий актер 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());