在主管内 - >儿童演员模型,其中创建了10个孩子,并通过RoundRobinRoutingLogic
在所有孩子之间平均分配工作。一些演员被编程为在一段时间后停止。最后,我想看看我所有的孩子演员的状态(他们是否还活着)。但是我无法在ActorRef
内看到任何相关文档。
以下是我的主管课程的一部分:
Router router;
{
counter = 0;
List<Routee> routees = new ArrayList<Routee>();
for (int i = 0; i < 10; i++) {
ActorRef r = getContext().actorOf(Props.create(Children.class));
getContext().watch(r);
routees.add(new ActorRefRoutee(r));
}
router = new Router(new RoundRobinRoutingLogic(), routees);
}
以下是子actor中导致它们停止的条件:
if (/*some condition*/) {
getContext().parent().tell(new Response(startTime, messages, Status.SUCCESS), getContext().parent());
getContext().stop(getSelf());
}
我可以使用akka工具包中的正确API来打印Supervisor类中所有子actor的状态吗?
答案 0 :(得分:1)
有几种方法。
首先,我看到你watch
来自主管的路由,这是因为你必须在终止时从路由器中删除路由。观看演员意味着当孩子终止时,观察者(在您的情况下是主管)将收到Terminated(actorRef)
消息。您可以使用它来维护您自己的活动路由列表(您应该在接收此类消息时更新路由器)。因为您应该已经在更新路由器,所以您始终可以使用router.getRoutees()
其次,ActorContext
提供getChildren()
方法,您可以使用该方法枚举当前有效的路由。您还可以使用getChild(name)
按名称检查特定路由器的状态,但当然您必须在创建它们时为其设置名称...
第三,您可以制定自己的协议,主管可以向所有路由广播自定义消息,并让他们回复您的其他消息。这种方法的缺点是你必须引入某种超时机制,因为你永远不会知道有多少路由器在接收你的消息,因此可能会有什么样的答案。
我在这里停下来是因为我认为除非你有更精确的要求,否则我不会采取任何其他措施,而不是上面的第一个解决方案......为什么重新发明轮子?