Я использую Джерси в приложении Java SE. HK2 обеспечивает внедрение зависимостей для всего приложения. HK2 RunLevel службы зарегистрированы в локаторе службы приложений, который является родительским для локатора службы Jerseys.
+ application locator
|\- RunLevel capabilities
| - MyCustomService, @RunLevel(value=1)
\
+ jersey locator
\- jersey resource class
\ @Inject MyCustomService
Моя проблема заключается в том, что я не могу получить доступ к службам уровня запуска из Джерси. Когда - в приведенном выше примере - ресурс джерси открыт, внедрение MyCustomService
завершается неудачно:
java.lang.IllegalStateException: Не удалось найти активный контекст для org.glassfish.hk2.runlevel. RunLevel
Причина этого, по-видимому, заключается в том, что службы, стоящие за функцией RunLevel HK2, имеют видимость LOCAL : локатор джерси не может получить к ним доступ через родительский локатор. См. здесь .
Вопросы:
- Почему службы функции уровня запуска ограничены в видимости?
- Чтоя могу сделать, чтобы преодолеть это?
Обновление
Чтобы дать контекст для вопроса, я использую уровни выполнения в стиле "System-V".
- Запускается приложение Java SE. По умолчанию начальный уровень запуска равен -1, целевой уровень запуска равен 3. На своем пути для успешного продолжения необходимо пройти различные этапы.
- На уровне выполнения 1 устанавливаются подключения к зависимым внешним приложениям (база данных, memcache, брокер сообщений). и т. д.)
- На уровне выполнения 2 запускаются
ExecutorServices
для фоновой обработки и HTTP-сервисов (с запущенным трикотажем). Джерси отклоняет все входящие запросы на этом уровне. - На уровне выполнения 3
MessageListeners
присоединяются к брокеру, отправляя запросы фоновым исполнителям. Джерси принимает и обрабатывает HTTP-запросы.
Эта концепция позволяет детально контролировать доступность и длительные запросы. При закрытии приложение будет находиться на уровне выполнения 2, пока не будут выполнены ранее принятые HTTP-запросы и не завершены поставленные в очередь фоновые задачи. Тем не менее, новые задачи / запросы не принимаются. Затем, уровень выполнения 1, 0, -1, выход.