И то stop
и другое PoisonPill
прервет актера и остановит очередь сообщений. Они заставят субъекта прекратить обработку сообщений, отправить стоп-вызов всем его дочерним элементам, дождаться их завершения, а затем вызвать свой postStop
хук. Все дальнейшие сообщения отправляются на почтовый ящик мертвых писем.
Разница в том, какие сообщения обрабатываются до начала этой последовательности. В случае 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