我创建了一个像这样的演员池:
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 - 这是正确的行为吗?我应该如何将消息发送回产生路由器演员的演员?我很困惑。
答案 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());
}