Pytanie Akka dla początkujących - czytam Akka Essentials, czy ktoś mógłby wyjaśnić różnicę między Akka Stop / Poison Pill a Kill? Książka zawiera tylko małe wyjaśnienie: „Zabijanie jest synchroniczne, a pigułka z trucizną jest asynchroniczna”. Ale w jaki sposób? Czy wątek wzywającego aktora blokuje się w tym czasie? Czy aktorzy-dzieci są powiadamiani podczas zabijania, przywołani po postu itp. Przykładowe zastosowania jednej koncepcji a drugiej?
Wielkie dzięki!
context.become
?context.become
oznacza zachowanie, które należy zastosować do następnej wiadomości, co oznacza, że zadziała ona po przetworzeniu bieżącej wiadomości; pod tym względem jest całkiem jakcontext.stop(self)
.Odpowiedzi:
Zarówno
stop
iPoisonPill
zakończy działanie aktora i zatrzyma kolejkę komunikatów. Spowodują, że aktor zaprzestanie przetwarzania wiadomości, wyśle wezwanie stop do wszystkich swoich dzieci, zaczeka na ich zakończenie, a następnie zadzwoni dopostStop
haka. Wszystkie dalsze wiadomości są wysyłane do skrzynki z martwymi listami.Różnica polega na tym, że wiadomości są przetwarzane przed rozpoczęciem tej sekwencji. W przypadku
stop
połączenia aktualnie przetwarzana wiadomość jest najpierw uzupełniana, a wszystkie pozostałe są odrzucane. Podczas wysyłania aPoisonPill
jest to po prostu kolejna wiadomość w kolejce, więc sekwencja rozpocznie się poPoisonPill
odebraniu. Wszystkie wiadomości znajdujące się przed nią w kolejce zostaną przetworzone w pierwszej kolejności.Natomiast
Kill
komunikat powoduje, że aktor wyrzuca ten,ActorKilledException
który jest obsługiwany przy użyciu normalnego mechanizmu nadzorczego. Zatem zachowanie tutaj zależy od tego, co zdefiniowałeś w strategii swojego przełożonego. Domyślnie aktor jest zatrzymany. Ale skrzynka pocztowa nadal się utrzymuje, więc gdy aktor uruchomi się ponownie, nadal będzie mieć stare wiadomości, z wyjątkiem tej, która spowodowała awarię.Zobacz także sekcję „Zatrzymanie aktora”, „Zabicie aktora” w dokumentacji:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
I więcej na temat strategii nadzoru:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
źródło
context.stop(self)
?Używaj PoisonPill, kiedy tylko możesz. Jest on umieszczany na skrzynce pocztowej i jest zużywany jak każda inna wiadomość. Możesz także użyć „context.stop (self)” z poziomu aktora.
źródło
PoisonPill asynchronicznie zatrzymuje aktora po zakończeniu wszystkich wiadomości odebranych do skrzynki pocztowej przed PoisonPill.
źródło
Możesz użyć zarówno zatrzymania aktora, jak i pigułki z trucizną, aby zatrzymać przetwarzanie aktorów, i zabić, aby zakończyć aktora w całości. x.stop to wywołanie wykonane metodą akka, zastąpi ono stan aktora nowym aktorem po wywołaniu postStop. x! PoisonPill to metoda przekazywana aktorowi w celu zatrzymania przetwarzania, gdy aktor jest uruchomiony (zalecane). zastąpi również stan aktora po wywołaniu postStop. x.kill spowoduje zakończenie działania aktora i usunięcie aktora ze ścieżki aktora i zastąpienie całego aktora nowym aktorem.
źródło