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