Сначала я предполагаю, что вы забыли добавить sum += 1
при получении сообщения Inc
в дочернем актере при публикации вопроса, пожалуйста, измените. В противном случае, когда я проверяю, вы не можете получить свой вывод.
Далее объясните ваш код:
На следующей диаграмме видно, что preReStart
вызывается для старого экземпляра, а не для нового экземпляра.
Здесь также есть описание, подробности здесь
- Старый субъект получает информацию о вызове preRestart с исключением, которое вызвало перезапуск, и сообщением, которое вызвало это исключение; последний может быть Нет, если перезапуск не был вызван обработкой сообщения, например когда супервизор не перехватывает исключение и по очереди перезапускается его супервизором, или если актер перезапускается из-за сбоя одного из братьев и сестер. Если сообщение доступно, то отправитель этого сообщения также доступен обычным способом (то есть путем вызова отправителя). Этот метод является лучшим местом для очистки, подготовки передачи к свежему экземпляру субъекта и т. Д. По умолчанию он останавливает все дочерние элементы и вызывает postStop.
- Исходная фабрика из вызова actorOf используется для создания нового экземпляра.
- Новый метод postRestart нового актера вызывается с исключением, которое вызвало перезапуск. По умолчанию предварительный запуск вызывается, как и при обычном запуске.
Итак, для вашего примера:
- при вызове
preRestart
выводится сумма старого актера, то есть 2
, обратите внимание: у вас есть inc.
- при вызове
postRestart
выводится сумма нового актера, то есть начальное значение 1
с вычислением sum = sum * 2
, в конце выдается 2
, а не 4
. Inc message
просто получает на старом экземпляре, а не на новом.
Наконец, содержание книги:
Когда субъект выдает исключение, он отправляет сообщение супервизору, и супервизор обрабатывает сбой, перезапуская этого субъекта. Он очищает накопленное состояние субъекта и создает новый новый субъект, то есть восстанавливает последнее значение, назначенное состоянию старого субъекта, до значения preRestart.
Я думаю, что вы обеспокоены it then restores the last value assigned to the state of old actor to the preRestart value
. Я не совсем знаю, что это значит, если вы просто думаете, что оно присваивает последнее значение старого актора функции preRestart
, тогда это правильно, так как он просто запускается на старом экземпляре, в противном случае, это кажется конфликтующим с официальным руководством akka & эксперимент; И, если хотите восстановить значение, нам, возможно, пришлось использовать resume
, а не restart
.
В любом случае, я думаю, что мы должны использовать официальный документ akka в качестве стандарта и понимать правильную логику.