Java 8 使用Akka actorFor执行演员查找

Java 8 使用Akka actorFor执行演员查找,java-8,akka,Java 8,Akka,我有以下Akka演员: public class MyActor extends AbstractActor { protected Logger log = LoggerFactory.getLogger(this.getClass()); @Override public Receive createReceive() { return receiveBuilder() .matchAny(message -> {

我有以下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()

然而,在我上面的代码中,
self()
似乎成为了
转世我的父母,正如
myFullName
仅仅是“
MySystem/user/MyActor
”,而
转世fullname
是“
MySystem/user/MyActor/MyActor

我读对了吗?如果是这样,我如何调用(…)
(或任何其他相关方法)的
context().actorf,使
myFullName
reinnativefullname
相同(以便
self()
转世我
指的是同一个演员?如果我读得不对,为什么
我的全名
转世全名
不同


更新:
首先,
ActorContext.actorFor(String)
被弃用,取而代之的是
ActorContext.actorSelection(String)
。此方法返回一个actorSelection,但您仍然可以向actorSelection发送一条消息(例如标识,它会自动响应一条ActorIdentity消息)


actorFor
方法的文档中说,“绝对URI类似于akka://appname/user/actorA 如actorOf(ActorPath)所述进行查找。“我在
actorOf(ActorPath)上找不到文档
method,但是另一个
actorOf
方法声明它们创建了新的参与者,所以我怀疑这也是一样的。您发现的行为可能是不推荐使用的原因,或者是因为它被不推荐使用,并且使用了其他方法。

谢谢@Rob Crawford(+1)请参阅我上面的更新。关于
actorSelection(…)
的使用,您可以确认两件事:(1)我可以将任何消息/对象发送到
actorSelection
实例,而不仅仅是烘焙在Akka附带的
Identification
中,更重要的是,(2)返回的
ActorSelection
根据提供的选择路径查找并重用(不创建!)现有的参与者?再次非常感谢!tell()ActorSelection的方法接受一个对象,因此任何消息都可以发送,我从自己使用ActorSelection的过程中知道,如果存在一个参与者,它将重用现有的参与者。如果没有与ActorSelection匹配的参与者,消息将进入死信箱。你太棒了!谢谢Rob!
public class AnotherActor extends AbstractActor { ... }

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

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