路由器池中的context()。parent()

时间:2018-05-08 13:05:11

标签: java akka router

我创建了一个像这样的演员池:

 public ParentActor() {

    childRouter = getContext().actorOf(
        new SmallestMailboxPool(actorPoolSize)
            .props(Props.create(Child.class)),
        "ChildRouter");
  }

然后在儿童演员的某个地方我有以下内容:

if (message instanceof someMessage) {

    context().parent().tell(someOtherMessage, getSelf());
}

我原以为sometherMessage会收到ParentActor;相反,这进入了一个无限循环。为了进一步调试,我在子actor中添加了一些日志,如下所示:

log.debug("who is my parent {} ",  context().parent().getPath())

这给了我以下路径:

/ActorSystem/user/ParentActor/ChildRouter

这让我觉得池中其中一个actor的父节点是路由器actor - 这是正确的行为吗?我应该如何将消息发送回产生路由器演员的演员?我很困惑。

1 个答案:

答案 0 :(得分:3)

是的,路由器是路由的父(或主管)。来自documentation

  

池路由器创建的路由将创建为路由器的子路由。因此路由器也是孩子的主管。

当您在白痴中进行以下呼叫时......

context().parent().tell(someOtherMessage, getSelf());

...将someOtherMessage消息发送到路由器。

您命名为ParentActor的actor不是作为Child池一部分创建的childRouter actor的父级。如果您希望routee向ParentActor发送消息,一种方法是更改​​Child actor类以将ActorRef作为构造函数参数:

public class Child extends AbstractActor {
  private final ActorRef target;

  public Child(ActorRef target) {
    this.target = target;
  }

  // ...
}

然后在ParentActor中,在创建路由器时,您可以将ParentActor(带getSelf())的引用传递给Props以创建路由:

childRouter = getContext().actorOf(
    new SmallestMailboxPool(actorPoolSize)
        .props(Props.create(Child.class, getSelf())),
    "ChildRouter");

现在,Child演员可以向ParentActor发送消息:

if (message instanceof someMessage) {
  target.tell(someOtherMessage, getSelf());
}