Вопрос с новичком в Акке - я читаю Akka Essentials, может кто-нибудь объяснить разницу между Akka Stop/Poison Pill vs. Kill? Книга предлагает лишь небольшое объяснение: "Убить синхронно против ядовитой таблетки асинхронно". Но каким образом? Заблокирован ли поток вызывающего актера в течение этого времени? Представлены ли дочерние субъекты во время убийства, после остановки и т.д.? Пример использования одного понятия в сравнении с другим?
Большое спасибо!
Оба 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
Используйте PoisonPill, когда можете. Он помещается в почтовый ящик и потребляется как любое другое сообщение. Вы также можете использовать "context.stop(self)" изнутри актера.
PoisonPill асинхронно останавливает актера после его завершения со всеми сообщениями, которые были получены в почтовый ящик, до PoisonPill.
context.become
?