2013-12-03 2 views
0

Я новичок в OSGi и изучал его некоторое время.Diff btw ServiceTracker, ServiceReference & ServiceReferences

Я хочу знать основные различия в использовании и преимуществах для ServiceTracker, ServiceReference & ServiceReferences.

я использовал пример с обоими ServiceTracker & ServiceReference и если услуга не доступна, то оба возвращают NULL. Однако, если услуга доступна, оба работают нормально, но я не мог понять, в чем разница между двумя.

Где-то я читал ServiceTracker - это программный способ получить ссылку на услугу. то есть записать код ServiceTracker, который «отслеживает» ссылку на другую услугу, и давайте использовать ее, когда она станет доступной., но на практике я не мог видеть, как это делается!

Может ли кто-нибудь объяснить это? Спасибо.

ответ

4

Я рекомендую вам не использовать ни одного!

ServiceReference просто представляет запись в системном реестре OSGi. Вероятно, вы имеете в виду, что вы обращаетесь к службам с помощью вызовов API, таких как BundleContext.getServiceReference(). Это самый низкий уровень работы с службами OSGi, и, как вы, вероятно, заметили, что это довольно сложно, и он связывает ваш код с API OSGi.

ServiceTracker - это немного более высокий уровень, он обходит вокруг вызовов более низкого уровня. Главное преимущество заключается в том, что он уведомляет вас о том, что служба уходит, что очень важно, потому что услуги являются динамическими. Однако ServiceTracker все еще очень низкоуровневый, и он по-прежнему связывает ваш код с API OSGi.

я настоятельно рекомендую избегать как самого низкого уровня API (на основе вокруг ServiceReference) ВМЕСТЕ ServiceTracker пока вы не получили гораздо больше опыта с OSGi.

В качестве альтернативы я рекомендую изучать декларативные услуги. Это дает вам модель программирования, основанную на инъекции зависимостей, и отделяет вас от API OSGi. Гораздо проще и безопаснее! Вы можете начать с учебника здесь: http://bndtools.org/tutorial.html

+0

Hi @Neil, можно ли Maven с bndtools? Кроме того, возможно ли отложить генерацию .jar после выполнения сборки. Мое требование к проекту состоит в том, чтобы создать банку в конце и использовать maven. – Amrit

+0

Хороший ответ +1. Кстати, ваша книга потрясающая, даже если это всего лишь черновик. Я узнал от этого большинство моих знаний OSGi! –

0

Я согласен с тем, что сказал Нейл, но мне нужно продлить его, чтобы ответить на ваш комментарий: Если вы хотите создать свой проект с помощью декларативных услуг с использованием Maven, вам необходимо использовать maven-bundle-plugin и maven-scr-plugin. Первый использует bnd под капотом, в то время как последний обрабатывает ваши аннотации DS. Пример:

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <version>2.3.7</version> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-Name>${project.name}</Bundle-Name> 
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
        <Export-Package>${project.artifactId}.api</Export-Package> 
       </instructions> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-scr-plugin</artifactId> 
      <version>1.9.0</version> 
      <executions> 
       <execution> 
        <id>generate-scr-scrdescriptor</id> 
        <goals> 
         <goal>scr</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

В этом примере (который находится в разделе build) я направляю maven-bundle-plugin экспортировать все пакеты в моем ${project.artifactId}.api каталоге (это соглашение в моих OSGi проектов) и maven-scr-plugin генерирует XML-конфигурации * на основе в аннотации декларативных услуг Apache Felix.

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

У меня есть приложение OSGi пример вы посмотрите на может: here

Смежные вопросы