Newbie question of Akka - Je lis Akka Essentials, quelqu'un pourrait-il expliquer la différence entre Akka Stop/Poison Pill et Kill? Le livre offre juste une petite explication "Kill is synchrone vs. Poison pill est asynchrone." Mais de quelle manière? Est-ce que le thread d'acteur appelant se verrouille pendant ce temps? Les enfants acteurs sont-ils avertis lors du kill, de l'après-arrêt, etc.? Exemple d'utilisation d'un concept par rapport à l'autre?
Merci beaucoup!
stop
et PoisonPill
mettront fin à l'acteur et arrêteront la file d'attente des messages. Ils feront en sorte que l'acteur cesse de traiter les messages, envoie un arrêt à tous ses enfants, attend qu'ils se terminent, puis appelle 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ébut de cette séquence. Dans le cas de l'appel stop
, le message en cours de traitement est terminé en premier, tous les autres étant ignorés. Lors de l'envoi d'un PoisonPill
, il s'agit simplement d'un autre message dans la file d'attente. La séquence démarre dès la réception de PoisonPill
. Tous les messages en attente dans la file d'attente seront traités en premier.
En revanche, le message Kill
force l'acteur à lancer un ActorKilledException
qui est traité à l'aide du mécanisme de superviseur normal. Le comportement ici dépend donc de ce que vous avez défini dans votre stratégie de supervision. La valeur par défaut est d'arrêter l'acteur. Mais la boîte aux lettres persiste. Ainsi, au redémarrage de l'acteur, les anciens messages sont conservés, à l'exception de celui qui a provoqué l'échec.
Voir également les sections "Arrêter un acteur", "Tuer un acteur" dans la documentation:
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 chaque fois que vous le pouvez. Il est mis sur la boîte aux lettres et est consommé comme n'importe quel autre message. Vous pouvez également utiliser "context.stop (self)" depuis un acteur.