Entrambe stop
e PoisonPill
interromperanno l'attore e interromperanno la coda di messaggi. Faranno in modo che l'attore interrompa l'elaborazione dei messaggi, invii una chiamata di arresto a tutti i suoi figli, attendi che terminino, quindi chiama il suo hook postStop
. Tutti gli altri messaggi vengono inviati alla casella di posta delle lettere morte.
La differenza è quando i messaggi vengono elaborati prima dell'inizio di questa sequenza. Nel caso della chiamata stop
, il messaggio attualmente in fase di elaborazione viene completato per primo, con tutti gli altri scartati. Quando si invia un PoisonPill
, questo è semplicemente un altro messaggio nella coda, quindi la sequenza verrà avviata quando viene ricevuto il numero PoisonPill
. Tutti i messaggi che lo precedono nella coda verranno elaborati per primi.
Al contrario, il messaggio Kill
fa sì che l'attore lanci uno ActorKilledException
che viene gestito utilizzando il normale meccanismo di supervisione. Quindi il comportamento qui dipende da ciò che hai definito nella tua strategia di supervisione. 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.
vedere il 'arresto un attore' Inoltre, 'Uccidere un attore' la sezione nella documentazione:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
E più sulle strategie di supervisione:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
fonte
2012-12-12 20:49:21
rs_atl ha risposto molto bene, lasciatemi aggiungere che niente degli attori è sincrono, nemmeno context.stop (self). –
@RolandKuhn che dire 'context.become'? –
'context.become' indica il comportamento da applicare al messaggio successivo, il che significa che ha effetto dopo che il messaggio corrente è stato elaborato; a questo proposito è come 'context.stop (self)'. –