Акка: всегда ли DeathPactException является ошибкой программирования?
Я время от времени использую Akka.NET в своих проектах, поэтому я знаю технологию, могу с ней что-то делать, но не считаю себя экспертом.
Хотя я использую.NET, на этот вопрос наверняка может ответить кто-то, знакомый с Akka в JVM.
Недавно я наткнулся на DeathPactException
глядя на файл журнала приложения. Причиной был актер (актер А1), который смотрел другого актера (А2), которого он начал сам. А1, однако, не справился с Terminated
сообщение отправлено A2. Что было вызвано тем, что А2 фактически остановился после выполнения своей задачи. Благодаря разумно определенной иерархии супервизора и т. Д. Сама система работала просто отлично: A1 был просто перезапущен своим супервизором немедленно.
Есть ли на самом деле сценарий, где актер .Watch()
другой актер, а затем игнорировать Terminated
сообщение? Или печально DeathPactException
в основном всегда ошибка в коде приложения, похожая на NullReferenceException
/NullPointerException
?
1 ответ
DeathPactException
не обязательно указывает на ошибку программирования.
Умышленно не занимаясь Terminated
сообщение - это способ остановить всех детей актера, когда любой из детей этого актера останавливается нормально. Последовательность событий следующая:
- Актер
parent
наблюдает за всеми своими детьми,c1
,c2
, а такжеc3
, но не обрабатываетTerminated
сообщение. - ребенок
c2
останавливается нормально. parent
бросаетDeathPactException
, что приводит кparent
перезапустить (это стратегия супервизора по умолчанию, которая может быть переопределена вparent
супервайзер / родитель).parent
"spreRestart
вызывается хук, который по умолчанию останавливает всеparent
дети
Решив не обращаться с Terminated
сообщение является эффективным средством для реализации стратегии остановки "все для одного" в неисключительных (т.е. не в ответ на сбой) случаях.