Акка: всегда ли DeathPactException является ошибкой программирования?

Я время от времени использую Akka.NET в своих проектах, поэтому я знаю технологию, могу с ней что-то делать, но не считаю себя экспертом.

Хотя я использую.NET, на этот вопрос наверняка может ответить кто-то, знакомый с Akka в JVM.

Недавно я наткнулся на DeathPactException глядя на файл журнала приложения. Причиной был актер (актер А1), который смотрел другого актера (А2), которого он начал сам. А1, однако, не справился с Terminated сообщение отправлено A2. Что было вызвано тем, что А2 фактически остановился после выполнения своей задачи. Благодаря разумно определенной иерархии супервизора и т. Д. Сама система работала просто отлично: A1 был просто перезапущен своим супервизором немедленно.

Есть ли на самом деле сценарий, где актер .Watch() другой актер, а затем игнорировать Terminated сообщение? Или печально DeathPactException в основном всегда ошибка в коде приложения, похожая на NullReferenceException/NullPointerException?

1 ответ

Решение

DeathPactException не обязательно указывает на ошибку программирования.

Умышленно не занимаясь Terminated сообщение - это способ остановить всех детей актера, когда любой из детей этого актера останавливается нормально. Последовательность событий следующая:

  1. Актер parent наблюдает за всеми своими детьми, c1, c2, а также c3, но не обрабатывает Terminated сообщение.
  2. ребенок c2 останавливается нормально.
  3. parent бросает DeathPactException, что приводит к parent перезапустить (это стратегия супервизора по умолчанию, которая может быть переопределена в parentсупервайзер / родитель).
  4. parent"s preRestart вызывается хук, который по умолчанию останавливает все parentдети

Решив не обращаться с Terminated сообщение является эффективным средством для реализации стратегии остановки "все для одного" в неисключительных (т.е. не в ответ на сбой) случаях.

Другие вопросы по тегам