Сервис OSGi против последовательности запуска пакета - PullRequest
3 голосов
/ 20 марта 2019

С учетом двух пакетов OSGi foo и bar, а также:

  • bar импорт (Import-Package:) пакетов из foo.
  • bar реализует службу, определенную в foo.

Допускается ли , чтобы служба в foo использовала (@Reference) службу из bar (согласно спецификации OSGi)?

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

(меня меньше интересует, поддерживает ли какая-то конкретная реализация OSGi.)

EDIT Справочная информация. Таким образом, пакет OSGi может обеспечить реализацию пользовательских служб для некоторой библиотеки ( SPI )

1 Ответ

2 голосов
/ 20 марта 2019

@Reference - аннотация SCR для спецификации времени выполнения сервисного компонента. Вы должны различать фазу resolution (процесс между установкой пакета и его установкой active ) и подключением сервисных ссылок.

Придерживаясь компонентов SCR - вы можете представить себе два компонента, которые экспортируют (@Service аннотация) некоторую службу и ссылаются друг на друга (используя @Reference) - таким образом вы попадаете в тупиковую ситуацию.

Но сценарий, который вы описали, кажется хорошим.

  1. bar импортирует пакеты из foo - так что это разрешается после foo. Конечно, если вы устанавливаете пакеты вручную и сначала устанавливаете bar, а затем foo, вам необходимо обновить / перезапустить bar
  2. foo @Reference s сервисов от bar - это только означает, что среда выполнения SCR активирует данный компонент SCR в foo после того, как сервис станет доступным

Karaf, использующий его функции добавляет еще один уровень разрешения (стандартный распознаватель OSGi) для пакетов функций. Так что это всегда лучше, чем устанавливать пакеты вручную (или перетаскивать их все в какой-либо каталог автоматического развертывания).

Также запомни одну вещь. Если каким-либо образом ваш пакет получает заголовок манифеста Import-Service (или Require-Capability) (он может быть сгенерирован с помощью maven-bundle-plugin), может произойти сбой разрешения, поскольку службы обычно регистрируются асинхронно позже, после запуска пакета (с использованием чертежа или время выполнения scr). Я лично обычно избавляюсь от этих заголовков, используя эту конфигурацию:

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <extensions>true</extensions>
  <configuration>
    <instructions>
      <_removeheaders>Import-Service,Require-Capability</_removeheaders>
...
    </instructions>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...