Entrambi stop
e PoisonPill
termineranno l'attore e interromperanno la coda dei messaggi. Faranno sì che l'attore interrompa l'elaborazione dei messaggi, invierà una chiamata di arresto a tutti i suoi figli, attenderà che terminino, quindi chiamerà il suo postStop
hook. Tutti gli altri messaggi vengono inviati alla casella delle lettere morte.
La differenza è in quali messaggi vengono elaborati prima dell'inizio di questa sequenza. Nel caso della stop
chiamata, il messaggio attualmente in fase di elaborazione viene completato per primo e tutti gli altri vengono scartati. Quando si invia un PoisonPill
, questo è semplicemente un altro messaggio in coda, quindi la sequenza inizierà quando PoisonPill
verrà ricevuto. Tutti i messaggi che sono in coda nella coda verranno elaborati per primi.
Al contrario, il Kill
messaggio fa sì che l'attore lanci un fileActorKilledException
che viene gestito utilizzando il normale meccanismo del supervisore. Quindi il comportamento qui dipende da ciò che hai definito nella tua strategia di supervisore. L'impostazione predefinita è fermare l'attore. Ma la casella di posta persiste, quindi quando l'attore si riavvia avrà ancora i vecchi messaggi tranne quello che ha causato l'errore.
Vedi anche la sezione "Fermare un attore", "Uccidere un attore" nei documenti:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
E altro sulle strategie di supervisione:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html