java - 查找akka中所有 child Actor 的状态

标签 java multithreading concurrency akka actor

在主管 -> 子角色模型中,创建了 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/

相关文章:

.net - 并发软件设计

java - 应用程序在 recyclerViewPager 上运行时不显示任何内容

java - MVC Crud 操作不起作用

java - 一个合适的基准?

c++ - 在主程序退出期间销毁等待 std::condition_variable 的线程的正确方法

java - FileInputStream 和 FileOutputStream 到同一个文件 : Is a read() guaranteed to see all write()s that "happened before"?

java - 如何为客户端添加隐式批处理?

java - 守护线程 - 用例

java - 如何使用 SimpleDateFormat 格式化 jQuery 日期

c++ - 用原子做饱和运算