Sowohl stop
als auch PoisonPill
beenden den Aktor und stoppen die Nachrichtenwarteschlange. Sie werden den Schauspieler veranlassen, die Verarbeitung von Nachrichten zu beenden, einen Stoppanruf an alle seine Kinder zu senden, auf deren Beendigung zu warten und dann seinen postStop
Hook aufzurufen. Alle weiteren Nachrichten werden an das Postfach für nicht zustellbare Nachrichten gesendet.
Der Unterschied besteht darin, dass Nachrichten verarbeitet werden, bevor diese Sequenz beginnt. Bei dem Aufruf stop
wird die gerade bearbeitete Nachricht zuerst beendet, alle anderen werden verworfen. Wenn Sie eine PoisonPill
senden, ist dies einfach eine andere Nachricht in der Warteschlange, so dass die Sequenz startet, wenn die PoisonPill
empfangen wird. Alle Nachrichten, die sich in der Warteschlange befinden, werden zuerst verarbeitet.
Im Gegensatz dazu verursacht die Nachricht Kill
den Aktor, eine ActorKilledException
zu werfen, die mit dem normalen Supervisor-Mechanismus behandelt wird. Das Verhalten hängt also davon ab, was Sie in Ihrer Supervisor-Strategie definiert haben. Standardmäßig wird der Actor gestoppt. Das Postfach bleibt jedoch bestehen. Wenn der Akteur neu gestartet wird, werden immer noch die alten Nachrichten angezeigt, mit Ausnahme der Nachricht, die den Fehler verursacht hat.
Siehe auch den 'Stoppen eines Actor', 'einen Schauspieler Töten' Abschnitt in der Dokumentation:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
Und mehr über Überwachungsstrategien:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
rs_atl hat es sehr gut beantwortet, lassen Sie mich einfach hinzufügen, dass nichts über Akteure synchron ist, nicht einmal context.stop (selbst). –
@RolandKuhn was ist 'context.become'? –
'context.become' bezeichnet das Verhalten, das auf die nächste Nachricht anzuwenden ist, was bedeutet, dass es wirksam wird, nachdem die aktuelle Nachricht verarbeitet wurde; in dieser Hinsicht ist es ziemlich wie 'context.stop (self)'. –