АККА: безболезненные уведомления об ошибках актера - PullRequest
5 голосов
/ 05 января 2012

Beautiful People Lifestyle

  • Компонент BEAUTIFUL использует свой внутренний akka.actor.Actor, чтобы делать определенные вещи .. (например, "подыгрывать")

  • Существуют другие MAN компоненты, которые действительно хотели бы "взаимодействовать" с BEAUTIFUL

  • Когда BEAUTIFUL находит MANдостойно, прежде чем «взаимодействовать» с ним, она соглашается взять его номер телефона (назовем его ErrorHandler), вы знаете, просто позвонить ему на случай, если он уйдет утром и забыл свой Rolex на ее кроватитаблица

  • Хотя BEAUTIFUL является "высоким уровнем обслуживания" (не так ли все ..), и каждый раз, когда что-то плохое происходит внутри внутреннего субъекта BEAUTIFUL (например,OmgBrokenNailException, UglyPurseThrowable и т. д.), она сходит с ума, ей нужно полностью остановиться и позвонить MAN с использованием этого номера телефона (например, errorHandler.getOnItNowHoney( message, throwable ))

Beautiful People Problem

Супервизоры AKKA позволяют регистрировать два типа FaultHandlers => OneForOneStrategy и AllForOneStrategy, где, если подЛежащий Актор переопределяет preRestart / postRestart, он получает доступ к фактическому «бросаемому», например:

override def preRestart( reason: Throwable ) { // do with throwable... }

Проблема в том, что обе эти стратегии попытаются перезапустить Актера (ов), что не является чем-то, что яищуЯ ищу актера для вызова внешнего ErrorHandler с «throwable» и остановки.

Если я не использую эти стратегии, когда исключение выдается изнутри Actor, postStopвызвал актера, что круто, но не требует "броска":

override def postStop() { // no access to "throwable"... }

Помогите MAN получить это throwable

Ответы [ 2 ]

5 голосов
/ 05 января 2012

В Akka 2 вы должны использовать DeathWatch

1 голос
/ 05 января 2012

Если я правильно понимаю вашу проблему, я думаю, что было бы целесообразно обернуть вашу обработку сообщений в блок try / catch и позволить субъекту обрабатывать отправку Throwable и останавливаться самостоятельно.

def receive = {
  case message => try { message match {
    case ... //your actual message processing goes here
  }} catch {
    case t: Throwable => {
      errorHandler ! t
      self.stop
    }
  }
}
...