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