Один из главных принципов Akka Actor - Пусть сокрушит . Так что это нормально, что актер получит исключение, он будет перезапущен по умолчанию его супервизором. Вы можете найти больше информации об отказоустойчивости в Akka в их документации отказоустойчивости-akka
Поэтому, когда есть исключение, это 2 быстрых решения, которые приходят мне в голову для решения этой проблемы:
- Повторить стратегию с контроллера : Не использовать запрос, а сообщить супервизору, когда операция БД была выполнена без исключений. Супервизор, в этом случае контроллер, может отслеживать в буфере операции записи, которые субъект запрашивал у субъекта. Когда контроллер получил OK от субъекта, он может удалить его из буфера, в другом случае, если ответ не получен в течение времени ожидания, вы можете повторить попытку, даже если субъект был разбит из-за исключения (mailRef субъекта будет то же самое и актер был бы перезапущен).
- ** Управление исключением **: Вы можете управлять исключением и обрабатывать его в супервизоре после того, как актер уничтожен, в зависимости от исключения, которое вы можете определить действия, которые нужно выполнить.
Я бы предпочел первый вариант, но всегда есть риск с моделью fire & забудь. Другой вариант, который сложнее реализовать, состоит в том, чтобы добавить персистентности субъекту и зарегистрировать сообщение как события. В этом случае у актера будет та информация, которая ему нужна для повторения операции после дробления.