context (). parent () в пуле маршрутизаторов - PullRequest
0 голосов
/ 08 мая 2018

Я создаю пул актеров, как это:

 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; вместо этого это входит в бесконечный цикл. Для дальнейшей отладки я добавил несколько журналов в дочерний актер следующим образом:

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

Это дает мне следующий путь:

/ActorSystem/user/ParentActor/ChildRouter

Что заставляет меня думать, что родитель одного из акторов в пуле является актором маршрутизатора - это правильное поведение? Как я должен отправить сообщение обратно субъекту, который породил субъект маршрутизатора? Я в замешательстве.

1 Ответ

0 голосов
/ 08 мая 2018

Да, маршрутизатор является родителем (или супервизором) маршрутов. Из документации :

Маршруты, созданные маршрутизатором пула, будут созданы как дочерние элементы маршрутизатора. Поэтому роутер также является наблюдателем за детьми.

Когда вы делаете следующий вызов в роутере ...

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

... сообщение someOtherMessage отправляется маршрутизатору.

Актер, которого вы назвали ParentActor, не является родителем Child актеров, созданных как часть пула childRouter. Если вы хотите, чтобы маршрутизатор отправил сообщение на ParentActor, один из подходов состоит в том, чтобы изменить класс актера Child, чтобы он принимал ActorRef в качестве аргумента конструктора:

public class Child extends AbstractActor {
  private final ActorRef target;

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

  // ...
}

Затем в ParentActor при создании маршрутизатора вы можете передать ссылку на ParentActorgetSelf()) на Props для создания маршрутов:

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

Теперь Child актеры могут отправлять сообщения на ParentActor:

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