Не могу найти сервис, потому что пакет OSGi не активирован - PullRequest
5 голосов
/ 06 января 2010

У меня проблема с обнаружением служб, предоставляемых некоторыми пакетами OSGi, которые не активируются. Позвольте мне описать ситуацию:

  • Пакет A определяет интерфейс X
  • Пакеты B, C и D предоставляют сервисы, реализующие интерфейс X
    • Сервисы этих пакетов регистрируются через Spring DM, поэтому они создаются только при активации пакета и Spring DM инициализирует контекст приложения, определенный в пакете
  • Пакет A активирован и в какой-то момент запрашивает реестр служб для служб для интерфейса X. Он не находит их, поскольку пакеты B, C и D не были переведены в состояние ACTIVE (они только РАЗРЕШЕНЫ ).

Я не могу запустить пакеты B, C или D и, следовательно, зарегистрировать их службы. Заставить их начать с добавления их в config.ini не вариант, потому что в приложении может быть установлено любое количество пакетов (через механизм обновления, подобный Eclipse p2), которые реализуют интерфейс X.

Приложение представляет собой приложение RCP на основе Eclipse 3.5, использующее Spring 2.5.6 и Spring DM 1.2.1.

Как заставить эти связки активироваться?

Ответы [ 3 ]

6 голосов
/ 08 января 2010

То, что у вас действительно есть, - это проблема иерархии зависимостей. Предлагаемое вами хакерское решение на самом деле является всего лишь бинтом по основной проблеме.

Что вы действительно должны учитывать, так это архитектуру вашей системы, поскольку в действительности у вас есть круговая зависимость (см. Обсуждение в комментариях к исходному сообщению). У вас (нравится вам это или нет) A требуется обслуживание (и в некотором смысле это зависит от) B и C. Между тем, B и C напрямую зависят от A, и поэтому не может запускаться, пока не появится A .

В лучшем случае вы можете написать код на B и C для прослушивания существования A, но это в лучшем случае маскирует (как я уже говорил) основную проблему. Что вы должны рассмотреть, так это разделить A на два набора, назовем их A1 и A2.

A1 должен предоставлять интерфейс, который требуется B и C (зависит от). А2 должен иметь слушателей, от которых зависят сервисы B и C. При запуске, если B и C требуются службы, A1 должен быть запущен, но A2 может запуститься в любое время позже, и все должно работать.

0 голосов
/ 09 февраля 2010

Также обратите внимание на felix fileinstall, который просматривает каталог для пакетов, автоматически устанавливает и запускает их. При удалении файла пакет также останавливается и удаляется.

0 голосов
/ 07 января 2010

Я думаю, что нашел решение этой проблемы, хотя это кажется немного хакерским.

Я наткнулся на этот поток , где Адриан Колайер подразумевал, что внешний "наблюдатель за пакетами" может отвечать за активацию пакетов, когда они установлены в платформу.

Итак, мое решение было:

  • Добавить пользовательский заголовок для соответствующих манифестов B, C и D, например, «MyApp-AutoStart: true»
  • Создание прослушивателя пакета, который отвечает, когда пакет переводится в состояние RESOLVED, и ищет заголовок
  • Если значение заголовка "true", прослушиватель пакета вызывает bundle.start()

Используя этот метод, пакеты, которые я хочу запустить, запускаются без необходимости использования config.ini, и они могут приходить и уходить когда угодно, но их услуги доступны при запросе.

...