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