Ответ 1
Оба stop
и PoisonPill
завершат действие актера и остановят очередь сообщений. Они заставят актера прекратить обработку сообщений, отправить стоп-вызов всем его детям, дождаться их завершения, а затем вызвать его postStop
hook. Все дальнейшие сообщения отправляются в почтовый ящик мертвых букв.
Разница в том, какие сообщения обрабатываются до начала этой последовательности. В случае вызова stop
сначала обрабатывается сообщение, которое обрабатывается, а все остальные отбрасываются. При отправке PoisonPill
это просто еще одно сообщение в очереди, поэтому последовательность запускается при приеме PoisonPill
. Все сообщения, которые впереди в очереди, будут обработаны первыми.
В противоположность этому сообщение Kill
заставляет актера бросать ActorKilledException
, который обрабатывается с использованием обычного механизма супервизора. Поэтому поведение здесь зависит от того, что вы определили в своей стратегии супервизора. Значение по умолчанию - остановить актера. Но почтовый ящик сохраняется, поэтому, когда актер перезагружается, он все равно будет иметь старые сообщения, кроме тех, которые вызвали сбой.
Также см. раздел "Остановка актера", раздел "Убийство актера" в документах:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
И больше о стратегиях надзора:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html