找到akka中所有儿童演员的状态

时间:2017-03-29 22:25:26

标签: java multithreading concurrency akka actor

在主管内 - >儿童演员模型,其中创建了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的状态吗?

1 个答案:

答案 0 :(得分:1)

有几种方法。

首先,我看到你watch来自主管的路由,这是因为你必须在终止时从路由器中删除路由。观看演员意味着当孩子终止时,观察者(在您的情况下是主管)将收到Terminated(actorRef)消息。您可以使用它来维护您自己的活动路由列表(您应该在接收此类消息时更新路由器)。因为您应该已经在更新路由器,所以您始终可以使用router.getRoutees()

查询其路由

其次,ActorContext提供getChildren()方法,您可以使用该方法枚举当前有效的路由。您还可以使用getChild(name)按名称检查特定路由器的状态,但当然您必须在创建它们时为其设置名称...

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

我在这里停下来是因为我认为除非你有更精确的要求,否则我不会采取任何其他措施,而不是上面的第一个解决方案......为什么重新发明轮子?