scala akka как отловить ActorInitializationException при использовании шаблона Ask - PullRequest
0 голосов
/ 16 мая 2018

Я делаю что-то вроде этого:

...lots of surrounding context...
val actor = context.actorOf(Props(new Actor(...))
(actor ? message) onComplete {
  case Done => {
   println("done")
   Do stuff with the surrounding context of this actor 
  }
  case _ => {
   println("got wildcard") // try to handle error message here
  }
}

Actor не удается при инициализации с

akka.actor.ActorInitializationException (в контексте этого актера)

Inродительский актер, которого я получаю **dead letters encountered.**, поскольку actor никогда не создавался должным образом и "message" не мог быть доставлен.

В этом сценарии шаблон "ask?" никогда не возвращается должным образом.

Я мог бы создать SupervisorStrategy на родительском глобальном уровне, но мне нужно понять контекст актера, который сгенерировал исключение, и невозможно (или удобно) обрабатывать его на глобальном уровне

Есть ли способ «перехватить» исключение инициализации в "ask" контексте actor ? message?

1 Ответ

0 голосов
/ 16 мая 2018

В соответствии с философией Акки ask следует использовать только тогда, когда вы взаимодействуете с актером извне системы актера.Поскольку у вас есть ссылка на context, кажется, что вы находитесь внутри кода актера.Поэтому вы должны попытаться избавиться от ask.

Если я ошибаюсь и вы звоните ask из кода, не являющегося аккой, то вам не следует пытаться полагаться на все, что происходит внутри системы актера.Все, что у вас есть, это ActorRef без каких-либо гарантий, что находится на другой стороне этой ссылки.

...