当前位置: 首页 > 知识库问答 >
问题:

Akka儿童演员返回一个void类型并拒绝发送消息

凌啸
2023-03-14

我正在学习Akka类型的Actor库,并尝试使用向特定Actor的所有子Actor发送消息。getContext()。getChildren()。但是它返回一个Void类型,而不是我最初创建的子参与者的类型-

我所做的解决方法是在创建时将子对象简单地存储在hashmap中。但这不是一个可伸缩的。

我该如何实现这一点?尤其是在分布式场景下?

        .onMessage(GetPosition.class, message -> {

            // whenever I send a GetPosition() message to myself,
            // I get that reminder and send an AskPosition to all workers

            while (results.keySet().size() < 10) {
                // while not finished, ask for positions from child actors

                // This is not working
                this.getContext().getChildren().forEach(child -> {
                    child.tell("this is a void class, so I cannot send any message to children");
                });

                // WORKAROUND:
                // get child  actors from hashmap (hashmap lambda has 2 things in it -> bi-consumer)
                racers.forEach((id, actor) -> actor.tell(new RacerBehavior.AskPosition(this.getContext().getSelf())));
            }

            return this;
        })

共有1个答案

吕骞尧
2023-03-14

由于无法静态地知道任意参与者将生成的子级所接受的消息类型,getChildren()只能返回ActorRef

如果您的所有孩子碰巧都是相同的类型(这将是能够在中遍历他们以发送消息的先决条件),类似这样的方式应该可以工作:

child.unsafeUpcast<Object>.narrow<RacerBehavior.AskPosition>

如果您不能绝对确定所有子对象都是相同的类型,那么可以使用父参与者状态下的类型显式跟踪它们(例如,每个类型有一个集合)。

 类似资料:
  • 我对阿克卡很陌生,我有一个(希望)简单的问题。我有一个参与者需要重复执行某个小的子任务——也就是说,每次这个参与者收到消息时,它都必须执行N个子任务。这个子任务是我指定给儿童演员的。我的问题是,我是否应该为每个子任务创建一个新的子角色实例?或者我应该简单地产生一个孩子演员,并发送N条消息?在这种情况下,最好的做法是什么? 为了更好地说明我的问题,这里有两个简化的示例(在Java中-但希望对Scal

  • 让我们假设一个使用Akka Typed实现的应用程序有一个持久执行元。这个持久执行元作为其操作的一部分创建了瞬态(或非持久)子执行元,每个子执行元都有一个唯一的ID,这些ID是持久状态的一部分。持久执行元还需要一些与其子级通信的方式,但我们不希望持久化子级的,因为它们实际上不是状态的一部分。在恢复时,持久参与者应该基于恢复的状态重新创建它的子级。这听起来并不像是一个很不寻常的用例,我正在试图弄清楚

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 我有几个演员在一个池子里。我希望这些演员中的每一个都能创造出儿童演员。问题是,当我创建子角色并保存引用时,我永远不知道哪个子角色将获得池化角色发送给它的消息。该池被创建为smallstMailBox池。在池演员的构造函数中,我这样做: 这是我的孩子。我做一些花样。有人问,也有人说,但结果不是同一个孩子。首先我做一个: 后来我一遍又一遍地做: (adReceive和adSend是AkkaDocume

  • 我是Akka的新手,我想知道我应该如何处理将工作委托给其他(儿童)演员的演员,但在哪里: 其中一些儿童演员必须按特定顺序参与;和 其中一些子参与者可以以任何顺序参与,并且可以真正地与主/父参与者所做的事情异步执行 假设我有以下儿童演员(不管他们做什么): 假设我有以下调用它们的父参与者: 如你所见: 必须首先“参与”(由家长调用),我们必须等待家长的响应,然后才能继续参与/调用、或 换句话说,当消

  • 假设我有一个参与者,负责根据某个键将消息路由到子参与者集合,因此其内部状态如下所示: 除了路由消息外,父参与者还必须支持添加和删除操作: 希望上面的代码足以让我大致了解我要做的事情。请注意,我使用map键作为子参与者的名称。问题在于,上述模式无法处理同一个键的添加、删除和添加消息的快速连续情况-它通常在第二次添加时失败,原因是: 显然,在Remove messages上停止子参与者是异步的,这就是