Программно используя компоненты в OSGi - PullRequest
2 голосов
/ 05 марта 2012

В моем приложении использование сервисов само по себе довольно бесполезно. Вам всегда нужна какая-то внешняя информация о конфигурации, чтобы служба могла быть полезной.

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

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

Я знаю, что могу снова экспортировать компонент как сервис и использовать его из других компонентов, но, скажем, у меня есть сервлет, в котором пользователь может создавать конфигурации, и для каждого настроенного экземпляра есть список действий ; когда он нажимает на действия, мне нужно найти соответствующий компонент и выполнить действие над ним.

Как лучше всего реализовать эту функцию поверх OSGi?

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

«Использование компонента из другого пакета программно» звучит для меня в точности , как для OSGi Services.

0 голосов
/ 12 октября 2017

Этот метод извлекает службу osgi (iso, имеющую зависимости от контейнера osgi):

public class ServiceLocator {

  public static <T extends Object> T getService(final Class<T> clazz) {
    final BundleContext bundleContext = FrameworkUtil.getBundle(clazz).getBundleContext();
    // OSGI uses the order of registration if multiple services are found
    final ServiceReference<T> ref =     bundleContext.getServiceReference(clazz);
    return bundleContext.getService(ref);
  }

}

Я использовал это при представлении DS в существующем проекте, который не использует DSвезде.Не все компоненты в проекте были созданы как компоненты OSGI DS.Везде, где мне нужно получить доступ к компоненту DS в классах, созданных любым другим способом, я использовал этот метод ...

...