查找 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) 通过名称检查特定路由的状态,但是当然您必须在创建它们时为它们设置一个名称...

第三,您可以制定自己的协议,主管可以向所有路由广播自定义消息,并让他们回复您的另一条消息。这种方法的缺点是你必须引入某种超时机制,因为你永远不知道有多少路由正在接收你的消息,因此可能会得到什么样的答案。

我在这里停下来是因为我认为除非您有更精确的要求,否则除了上面的第一个解决方案之外我不会选择其他任何东西...为什么要重新发明轮子?