Как я могу получить информацию об исключениях от Akka Supervisor? - PullRequest
1 голос
/ 07 августа 2011

Я тестирую, как новый Actor Я работаю над обработкой неожиданных сообщений. Я хотел бы заявить, что в этих случаях он выдает GibberishException. Вот тест и реализация до сих пор:

Тест:

"""throw a GibberishException for unrecognized messages""" in {
  //define a service that creates gibberish-speaking repositories
  val stubs = new svcStub(
    actorOf(new Actor{
      def receive = { case _ => {
          self.channel ! "you're savage with the cabbage"
        }
      }
    })
  )
  val model = actorOf(new HomeModel(stubs.svc,stubs.store))
  val supervisor = Supervisor(
    SupervisorConfig(
      OneForOneStrategy(List(classOf[Exception]), 3, 1000),
      Supervise(model,Permanent) :: Nil
    )
  )
  try{
    intercept[GibberishException] {
      supervisor.start
      model !! "plan"
    }
  } finally {
    supervisor.shutdown
  }
  stubs.store.plan should equal (null)
  stubs.svcIsOpen should be (false)
}

Реализация:

class HomeModel(service: PlanService, store: HomeStore)
extends Actor {
  private val loaderRepo = service.getRepo()
  private var view: Channel[Any] = null

  override def postStop() = {
    service.close()
  }

  def receive = {
    case "plan" => {
      view=self.channel
      loaderRepo ! LoadRequest()
    }
    case p: Plan => {
      store.plan=p
      view ! store.plan
    }
    case _ => throw new GibberishException(_)
  }
}

Однако, когда я запускаю тест, подробности исключения попадают в установленное мной Supervisor, но я не знаю, как с ними что-то сделать (например, зарегистрировать их или проверить их тип). Я хотел бы иметь возможность получить подробности об исключениях от супервизора, чтобы я мог перебросить и перехватить их в моем тесте. Вне метода тестирования я мог бы представить, что это полезно, если вы хотите сообщить о природе исключения в пользовательском интерфейсе работающего приложения. Есть ли способ получить это от Supervisor, когда это произойдет?

1 Ответ

3 голосов
/ 07 августа 2011

Измените OneForOneStrategy, чтобы он обрабатывал только исключение GibberishException, если это необходимо.

...