pkgajulapalli
pkgajulapalli

Reputation: 1126

Akka actors are getting stopped

I'm using akka actors to achieve parallel processing of some http requests. I've initailized a pool of actors using RoundRobinPool like:

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

It is working fine. But after the process is running for sometime, i'm getting following error

java.util.concurrent.CompletionException: akka.pattern.AskTimeoutException: Recipient[Actor[akka://web_server/user/MyActor#-769383443]] had already been terminated. Sender[null] sent the message of type "com.data.model.Request".

So I've overridden postStop method added a log statement there.

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

Now, I can see in the logs that the actors are getting stopped. But I'm not sure for which request it is happening. Once all the actors in the pool terminates (200 is the pool size I've set), I'm getting AskTimeoutException as said before. Is there anyway to debug why the actors are getting terminated?

EDIT 1

In the controller, I'm using the created actor pool like

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

The actor processes one kind of messages only.

@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());
    }
}

Upvotes: 1

Views: 2462

Answers (1)

Raman Mishra
Raman Mishra

Reputation: 2686

As far as you have described the probelm it seems you are processing your data inside the ask call and taking more time than askTimeout, and you are getting the error.

What you can do is either increase the askTimeout or do less processing inside tha ask call.

you should not do CPU bound operations inside the ask call, it can cause slowing down your system it is recommended that you should do the I/O bound operations inside the ask call. That way you can leverage the actors.

For example:

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

some db call you can do inside the ask call that is preferable.

Upvotes: -2

Related Questions