Как лучше всего обрабатывать ошибки инициализации в Play! Framework 2.0? - PullRequest
2 голосов
/ 21 марта 2012

Представьте, что у меня есть приложение, написанное с использованием Play 2 . Представьте, что приложению нужно захватить некоторые вещи при запуске (прочитать файл конфигурации, получить некоторые ресурсы из JNDI, и тому подобное). Play удобно предоставляет нам объект GlobalSettings , который мы можем использовать для включения в события начала и остановки:

import play.api._

object Global extends GlobalSettings {

  var someResource: Resource = _

  override def onStart(app: Application) {
    // might throw an exception if the path doesn't exist
    resource = JNDI.grabThing("/some/path").asInstanceOf[Resource]
  }  

}

Проблема в том, что мы можем сделать, если инициализация не удалась? Кажется, что это выполняется только тогда, когда Play получает первый запрос на приложение. Если мы выбрасываем исключение, это приводит к сбою этого запроса, но приложение продолжает работать.

В идеале, я бы хотел, чтобы приложение вообще не запускалось, если этот блок не завершился успешно. К сожалению, вызов Play.stop() на самом деле не останавливает Play. Я вижу, что черта Server определяет def stop(), что выглядит многообещающе, но я не могу найти способ заполучить экземпляр Server из моего приложения.

Возможно, я смотрю на это неправильно, и я не предполагал, что не сможет остановить Play (или даже просто мое приложение) из моего приложения, поэтому предложения по другим подходам Добро пожаловать.

Как лучше всего справиться с этими ошибками?

1 Ответ

1 голос
/ 21 марта 2012

Кажется, я лгу. Воспроизведение продолжает обслуживать запросы только после исключения в onStart, если вы работаете в режиме разработки (play run). Если запустить с play start (то есть в производственном режиме), исключение здесь приведет к завершению работы сервера, а это именно то, что я хотел.

Похоже, что файл RUNNING_PID лежит, что раздражает, но это отдельная проблема ...

...