actorSystem.stop(actor) and context.stop(actor) are the most common ways to stop an actor.PoisonPill
A major difference between calling the
stop method on an actor and sending it a PoisonPill message is in how the actor is stopped. - The
stopmethod lets the actor finish processing the current message in its mailbox (if any), and then stops it. - The
PoisonPillmessage lets the actors process all messages that are in the mailbox ahead of it before stopping it.
GracefulStop
You can use the gracefulStop approach if you want to wait for a period of time for the termination process to complete gracefully.gracefulStop(actorRef, timeout) “Returns a Future that will be completed with success when existing messages of the target actor has [sic] been processed and the actor has been terminated.” If the actor isn’t terminated within the timeout, the Future results in an ActorTimeoutException.If the order in which actors are terminated is important, using
gracefulStop can be a good way to attempt to terminate them in a desired order. Below is some notes of actor termination:
- Termination of an actor is performed asynchronously; the
stopmethod may return before the actor is actually stopped. - The actor will continue to process its current message, but no additional messages will be processed.
- An actor terminates in two steps. First, it suspends its mailbox and sends a
stopmessage to all of its children. Then it processes termination messages from its children until they’re all gone, at which point it terminates itself. If one of the actors doesn’t respond (because it’s blocking, for instance), the process has to wait for that actor and may get stuck. - When additional messages aren’t processed, they’re sent to the
deadLettersactor of theActorSystem(though this can vary depending on the mailbox implementation). You can access these with thedeadLettersmethod on anActorSystem.
No comments:
Post a Comment