Nouvelle question d’Akka – Je lis plus sur Akka Essentials, est-ce que quelqu’un pourrait expliquer la différence entre Akka Stop / Poison Pill et Kill? Le livre offre juste une petite explication “Kill is synchronous vs. Poison pill asynchronous”. Mais de quelle manière? Est-ce que le thread appelant est verrouillé pendant cette période? Les acteurs enfants sont-ils avertis lors de la mise à mort, envoi post-stop, etc.? Exemple d’utilisation d’un concept par rapport à l’autre?
Merci beaucoup!
Les deux stop
et PoisonPill
met fin à l’acteur et arrête la queue des messages. Ils obligeront l’acteur à cesser de traiter les messages, à envoyer un appel d’arrêt à tous ses enfants, à attendre qu’ils se terminent, puis à appeler son hook postStop
. Tous les autres messages sont envoyés à la boîte aux lettres de lettres mortes.
La différence réside dans le traitement des messages avant le démarrage de cette séquence. Dans le cas de l’appel d’ stop
, le message en cours de traitement est terminé en premier, tous les autres étant supprimés. Lors de l’envoi d’une PoisonPill
, il s’agit simplement d’un autre message dans la queue. La séquence démarrera dès la PoisonPill
la PoisonPill
. Tous les messages en attente dans la queue seront traités en premier.
En revanche, le message Kill
entraîne l’acteur à lancer une ActorKilledException
qui est gérée à l’aide du mécanisme de superviseur normal. Le comportement dépend donc de ce que vous avez défini dans votre stratégie de superviseur. La valeur par défaut est d’arrêter l’acteur. Mais la boîte aux lettres persiste, donc lorsque l’acteur redémarre, il conservera les anciens messages, à l’exception de celui qui a causé l’échec.
Voir aussi la section “Arrêter un acteur”, “Tuer un acteur” dans les documents:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
Et plus sur les stratégies de supervision:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
Utilisez PoisonPill quand vous le pouvez. Il est placé dans la boîte aux lettres et est consommé comme tout autre message. Vous pouvez également utiliser “context.stop (self)” depuis un acteur.
PoisonPill arrête de manière asynchrone l’acteur après qu’il ait fini avec tous les messages reçus dans la boîte aux lettres, avant PoisonPill.