Остановка OSGi Bundle, созданного с помощью Felix Dependency Manager, во время запуска

Мы используем Felix в качестве нашей платформы OSGi и Felix Dependency Manager для управления нашими компонентами OSGi. У нас есть ситуация, когда мы загружаем и проверяем XML в методе запуска компонента. Если проверка XML по схеме не удалась, мы хотели бы остановить пакет. У нас есть

  • попытался вызвать исключение в методе start, но пакет все еще активен
  • вызывается метод остановки Bundle в методе start, но это устанавливает пакет в нестабильное (останавливающее) состояние.

                FrameworkUtil.getBundle(this.getClass()).stop();
    

Как правильно выполнить это требование, а именно, если у метода start есть фатальная проблема, пакет должен оставаться остановленным?

1 ответ

Решение

Если вы хотите, чтобы пакет не становился активным после того, как кто-то попытался его запустить, вы должны выбросить исключение из start метод BundleActivator. Это лучший способ сообщить платформе, что что-то не так, и ваш пакет не может запуститься.

Вы пытаетесь выбросить исключение из start метод компонента. В этот момент пакет уже стал активным, так что вы опоздали.

Я бы рекомендовал в этом случае переопределить start метод из DependencyActivatorBase а также:

  1. Загрузите и проверьте ваш XML (и выведите исключение в случае сбоя).
  2. Вызвать start метод суперкласса, поэтому DM может выполнять свою работу.

Это неявно означает, что вы не можете использовать версию DM на основе аннотаций для этого пакета, поэтому, если вы использовали это, вы должны преобразовать его в пакет, который использует код для объявления своих компонентов и зависимостей.

Другие вопросы по тегам