在主管 -> 子角色模型中,创建了 10 个子角色,工作通过 RoundRobinRoutingLogic
在所有子角色之间平均分配。一些 Actor 被编程为在一段时间后停止。最后,我想看看我所有的 child Actor 的状态(无论他们是否活着)。但是我在 ActorRef
中看不到任何相关文档。
这是我的 Supervisor 类的一部分:
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);
}
这是导致他们停止的 child Actor 的条件:
if (/*some condition*/) {
getContext().parent().tell(new Response(startTime, messages, Status.SUCCESS), getContext().parent());
getContext().stop(getSelf());
}
我可以使用 akka 工具包中的哪个 API 来打印我的 Supervisor 类中所有子 actor 的状态?
最佳答案
有几种方法。
首先,我看到你从监督者那里watch
你的routees,这是因为当他们终止时你必须从路由器中删除routees。观看 Actor 意味着观看者(在您的情况下是主管)将在 child 终止时收到 Terminated(actorRef)
消息。您可以使用它来维护您自己的 Activity 路由列表(您应该在收到此类消息时已经更新了路由器)。因为您应该已经在更新路由器,所以您始终可以使用 router.getRoutees()
其次,ActorContext
提供了 getChildren()
方法,您可以使用它来枚举当前 Activity 的路由。您还可以使用 getChild(name)
通过名称检查特定路由的状态,但是当然您必须在创建它们时为它们设置一个名称...
第三,您可以制定自己的协议(protocol),主管可以向所有路由广播自定义消息,并让他们回复您的另一条消息。这种方法的缺点是您必须引入某种超时机制,因为您永远不会知道有多少路由正在接收您的消息,因此也不知道期望得到什么样的答案。
我在这里停下来是因为我认为除非您有更精确的要求,否则除了上面的第一个解决方案之外我不会选择其他任何东西......为什么要重新发明轮子?
关于java - 查找akka中所有 child Actor 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43105281/