Как происходит обмен данными между сервисом и пакетом в OSGi?

Я новичок в OSGi. Какие бы учебники я ни читал, я не могу найти, как происходит обмен данными между сервисом и пакетом. Я знаю, что один пакет должен быть зарегистрирован в реестре сервисов, чтобы другие пакеты могли их использовать. Однако я не могу понять, как происходит обмен данными между сервисом и комплектом. Как и в веб-сервисах, обмен данными осуществляется в формате XML или тому подобном и с использованием протокола Http. Итак, как происходит обмен данными между сервисом и использующим его бандлом. Тоже по какому-то протоколу или как? А также включает ли это какие-либо накладные расходы. Пожалуйста помоги

Спасибо


person user1147070    schedule 27.06.2012    source источник


Ответы (4)


Протокол не задействован. Вы выполняете стандартные вызовы методов Java.

Принцип работы примерно такой:

  1. Вы определяете интерфейс Java для своей службы. Просто нормальный интерфейс, ничего особенного реализовывать не надо. Например.

    интерфейс TimeService { public String getCurrentTime(); }

  2. Вы реализуете интерфейс (в отдельном пакете, который вы не экспортируете из своего пакета)

  3. Вы регистрируете этот интерфейс в реестре сервисов OSGi:

    timeServReg = bc.registerService(TimeService.class.getName(), new TimeServiceSimple(), реквизит);

  4. Во второй связке — той, которая хочет ею воспользоваться, вы ищете эту услугу:

    timeRef = bc.getServiceReference(TimeService.class.getName()); if (timeRef!= null) { timeService = (TimeService) bc.getService(timeRef); }

  5. Вы используете службу, просто используя объект Java, который вы только что получили. Вы вызываете методы:

    System.out.println("Текущее время: " + timeService.getCurrentTime());

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

Вы можете найти множество примеров здесь.

person pooh    schedule 27.06.2012
comment
Я пробовал аналогичный подход, с которым столкнулся, исключение приведения класса. Ссылка на примеры кажется неработающей, не могли бы вы предоставить ее - person Praful; 31.05.2016

Реестр службы OSGi подобен реестру объектов. Упрощенно это похоже на карту со строковыми ключами и значениями объекта. Любой пакет может поместить сервисный объект в эту карту, используя имя интерфейса, реализованного сервисным объектом. Затем другие пакеты могут искать объект службы, используя имя интерфейса. Все это выполняется в рамках одного и того же процесса Java VM. Таким образом, нет другого общения, кроме работы с объектами напрямую. В реестр службы OSGi добавлен новый API для работы с Java Generics и литералами классов. Это сделало работу с реестром служб OSGi более безопасной.

Дополнительной функцией являются удаленные службы OSGi. Это позволяет предоставлять услуги другим платформам OSGi, работающим в разных процессах Java (обычно на разных хостах). Доступно несколько реализаций связи. Некоторые используют веб-службы (xml/http), а другие используют прямой RPC.

person Gunnar    schedule 27.06.2012

Обмен данными происходит внутри JVM на основе интерфейсов служб (файлы .class интерфейса Java), которые должны быть импортированы как производителем службы, так и потребителем службы. Накладные расходы должны быть почти такими же, как стандартные вызовы Java (но, пожалуйста, поправьте меня, если я ошибаюсь).

Теперь, что касается поиска таких служб, использование реестра служб OSGi и средств отслеживания служб является одним из способов, но вы можете захотеть изучить декларативные службы или оболочку для них, которая является maven SCR и его аннотации, чтобы упростить эту задачу и обеспечить функциональность внедрения службы.

person Miquel    schedule 27.06.2012

Для связи между пакетами в OSGi есть три способа: 1) Blueprint 2) Declarative Services 3) IPOJO

Blueprint похож на DI в Spring с использованием Blueprint (файл xml). Декларативная служба поддерживает как аннотацию, так и xml. IPOJO также поддерживает аннотации и xml.

person Kishore Bhosale    schedule 20.09.2016