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

Akka演员被阻止了

穆正祥
2023-03-14
ActorRef myActorPool = actorSystem.actorOf(new RoundRobinPool(200).props(Props.create(MyActor.class, args)), MyActor.class.getSimpleName());

java.util.concurrent.CompletionException:Akka.Pattern.AskTimeoutException:收件人[Actor[akka:/web_server/user/MyActor#-769383443]]已终止。发送者[null]发送了类型为“com.data.model.request”的消息。

所以我重写了poststop方法,在那里添加了一个log语句。

@Override
public void postStop() {
    log.warn("Actor is stopped");
}

现在,我可以在日志中看到演员们被阻止了。但我不确定它是为了哪个请求发生的。一旦池中的所有执行元终止(200是我设置的池大小),我将得到前面所说的AskTimeoutException。是否有调试为什么演员被终止?

CompletableFuture<Object> s = ask(myActorPool, request, 1000000000).toCompletableFuture();
return s.join();

执行元只处理一种消息。

@Override
public AbstractActor.Receive createReceive() {
    return receiveBuilder()
            .match(Request.class, this::process)
            .build();
}

private void process(Request request) {
    try {
        // code here
    } catch (Exception e) {
        log.error(e.getMessage(), e);
        getSender().tell(new akka.actor.Status.Failure(e), getSelf());
    }
}

共有1个答案

郭子航
2023-03-14

就您所描述的probelm而言,您似乎是在ask调用中处理数据,并且花费了比askTimeout更多的时间,因此您会得到错误。

您可以做的是增加askTimeout或在ask调用内部进行更少的处理。

您不应该在ask调用中执行CPU绑定操作,这可能会导致您的系统变慢。建议您在ask调用中执行I/O绑定操作。这样你就可以利用演员了。

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

  • 假设我们有: 线程1,包含actor A、B和C。 包含执行元y的线程2。 包含演员Z的线程3。 演员A和B正在监听演员Y的消息。 然后,参与者C向参与者Z发出阻塞请求。 我包含了Actor Y,以允许它在Z处理来自C的请求时发送消息。 所有线程都在不同的物理核心上--它们并行运行。

  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?

  • 请注意:虽然我更喜欢使用Akka的JavaAPI的解决方案(这就是我正在使用的),但我对任何工作解决方案都很满意,并且可能会想出如何将基于Scala的答案翻译成Java。 我有一个Akka应用程序,有很多演员,其中两个是和。actor可以接受两种类型的消息: ;和 执行器简单地接受一条消息。这些参与者和系统其他部分之间的消息流如下: 任何东西(其他参与者,甚至参与者系统之外的事件驱动组件)都可以随

  • 我需要启动Akka(2.0)演员系统,发送一些消息,然后等待它做重举。之后,我需要做一些与那些演员无关的事情。 我试图等待所有参与者停止以下代码: 所有演员通过<代码>自我自杀!PoisonPill。我做错了什么?

  • 我想知道如何有效地清理在飞行中创建的akka演员。 要提供一点背景信息: 每个事件创建的演员层次结构。 主管- 在我的应用程序中,主管参与者动态创建其他参与者(在定期事件上)。我想在该事件的处理步骤完成后清理参与者。 所以,一旦处理完成,我想杀死所有的儿童演员。 我在成功完成后以与创建相反的方式传播消息(successfulProcessing)。(1)- 这是主管演员的代码。 这是清理动态创建的