2015-11-24 3 views
3

У меня проблема с управлением надзором.Наблюдение за моделью Akka

Предположим, у меня есть актер A, который создает актера B и отправляет ему сообщение.

val B = context.actorOf(Props[B],"B") 
B ! RandomMessage(param1, param2) 

B сделайте так, чтобы вычислить или попросить удаленное обслуживание. В принципе это может сбой с Exception.

override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false) { 
case exception:NetworkException => { 
    Restart 
    // here I don't have access to param1 and param2 to send message again 
} 

}

Он отлично работает, потому что ребенок актер перезапущен, но что, если я хочу, чтобы повторить это не удалось сообщение. Как я могу это сделать ?

ответ

6

Сообщение доступно в preRestart.

override def preRestart(reason: Throwable, message: Option[Any]) = { 
    self ! message.get 
    //to continue default behavior. ie, to restart all child actors 
    //you could even manage how you deal with your child actor here instead of calling super.preRestart 
    super.preRestart(reason, message) 
} 

Убедитесь, что вы настраиваете стратегию надзора таким образом, чтобы он не попадал в бесконечный цикл.

РЕДАКТИРОВАТЬ

Как упоминалось @Viktor Кланг, не используют Option#get вместо того, чтобы использовать Option#getOrElse и обрабатывать нечетным случай.

+0

Я могу использовать preRestart, но мне нужно было бы отправить сообщение: Option [Any] в мой тип команды. На данный момент у меня есть только одна команда, но позже я, вероятно, добавлю больше, и может возникнуть проблема. – Axpom

+0

Я предполагаю, что вы уже используете сопоставление образцов в вашем методе 'receive' для обработки сообщений. То же самое было бы достаточно для сообщений от preRestart. Просто убедитесь, что вы используете 'Option # get' вместо самой опции. – 757071

+1

Do * not * use Option.get, есть причина, по которой это опция, она не всегда доступна. –

Смежные вопросы