2012-12-12 4 views
189

Neue Frage von Akka - Ich lese gerade über Akka Essentials, könnte jemand bitte den Unterschied zwischen Akka Stop/Poison Pill und Kill erklären? Das Buch bietet nur eine kleine Erklärung "Kill ist synchron vs. Poison Pille ist asynchron." Aber auf welche Weise? Sperrt der Calling Actor Thread während dieser Zeit? Werden die Kinder beim Kill, Post-Stop, Envoke etc. benachrichtigt? Beispielanwendungen eines Konzepts gegenüber dem anderen?Akka Kill gegen Stop gegen Giftpille?

Vielen Dank!

+12

rs_atl hat es sehr gut beantwortet, lassen Sie mich einfach hinzufügen, dass nichts über Akteure synchron ist, nicht einmal context.stop (selbst). –

+1

@RolandKuhn was ist 'context.become'? –

+3

'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)'. –

Antwort

293

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

+4

ausgezeichnete Antwort danke, sollte auf der Akka-Tutorial geschrieben werden! – LaloInDublin

+13

Kill-Nachricht führt NICHT dazu, dass der Actor mit dem normalen Supervisor-Mechanismus neu gestartet wird, es sei denn, Sie verwenden eine nicht standardmäßige Supervisor-Strategie, weil ActorKilledException in "Stop", nicht "Restart" aufgelöst wird. – lisak

+0

Eigentlich ist das ziemlich ärgerlich, weil die einzige Möglichkeit, Schauspieler neu zu starten, eine Exception ist. – lisak

-1

PoisonPill stoppt asynchron der Akteur, nachdem alle Nachrichten, die in der Mailbox empfangen wurden, vor PoisonPill beendet wurden.

+16

Nein, Kill hat keine besondere Priorität, genau wie PoisonPill –

0

Verwenden Sie PoisonPill wann immer Sie können. Es wird auf das Postfach gestellt und wie jede andere Nachricht konsumiert. Sie können "context.stop (self)" auch innerhalb eines Actors verwenden.