Akka演员正在停止

时间:2018-07-25 06:19:23

标签: java scala akka actor timeoutexception

我正在使用Akka actor来实现对某些http请求的并行处理。我已经使用RoundRobinPool来丰富演员池,例如:

ActorRef myActorPool = actorSystem.actorOf(new RoundRobinPool(200).props(Props.create(MyActor.class, args)), MyActor.class.getSimpleName());

工作正常。但是在该程序运行了一段时间后,我遇到了以下错误

  

java.util.concurrent.CompletionException:akka.pattern.AskTimeoutException:Recipient [Actor [akka:// web_server / user / MyActor#-769383443]]已被终止。 Sender [null]发送了类型为“ com.data.model.Request”的消息。

因此,我重写了postStop方法,并在其中添加了一条日志语句。

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

现在,我可以在日志中看到演员正在停止。但是我不确定它是针对哪个请求的。一旦池中的所有参与者终止(我设置的池大小为200),我将得到AskTimeoutException,如前所述。无论如何,有没有调试演员为什么被解雇的原因?

编辑1

在控制器中,我正在使用创建的参与者池,例如

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 个答案:

答案 0 :(得分:-1)

就您所描述的问题而言,似乎您正在Ask呼叫内处理数据,并且花费的时间比askTimeout多,并且您得到了错误。

您可以做的是增加askTimeout或在Ask呼叫内进行更少的处理。

您不应在Ask调用内执行CPU绑定操作,否则可能导致系统变慢,建议您在Ask调用内执行I / O绑定操作。这样,您就可以利用演员了。

例如:

val x=x+1   // CPU bound operation should not do inside the ask call

您可以在Ask调用内进行一些数据库调用,这是更可取的。