使用Akka actorFor

时间:2018-11-20 11:01:20

标签: java-8 akka

我有以下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(...)不会创建 new actor,而是找到与您提供的路径/字符串匹配并返回的现有actor对此的引用。

但是,在上面的代码中,self()似乎是reincarnatedMe父级myFullName就是“ MySystem/user/MyActor ”,而reincarnatedFullName是“ MySystem/user/MyActor/MyActor” ...

我读对了吗?如果是这样,我该如何调用context().actorFor(...)(或与此有关的任何其他方法),以使myFullNamereincarnatedFullName相同(这样self()和{{1} }引用同一个演员?如果我没有读正确的话,为什么reincarnatedMemyFullName不同?


更新:

reincarnatedFullName

1 个答案:

答案 0 :(得分:2)

首先,不赞成使用selectedRow = field[:, col] for nextEmptySpace in np.nditer(selectedRow[ : :-1]): if selectedRow[int(nextEmptySpace)] == 0: break else: return 0 // if full field[int(nextEmptySpace), col] = value ,而赞成ActorContext.actorFor(String)。此方法返回一个ActorSelection,但是您仍然可以向ActorSelection发送一条消息(例如Identify,该消息会自动以ActorIdentity消息进行响应)。

ActorContext.actorSelection(String)方法的文档说:“像actorOf(ActorPath)的查找所描述的那样,查找akka:// appname / user / actorA之类的绝对URI。”我找不到关于actorFor方法的文档,但是其他actorOf(ActorPath)方法却声明它们创建了新的参与者,因此我怀疑这样做是否相同。您发现的行为可能是弃用的原因-或因为不赞成使用该行为以及用于其他用途的方法。