Компоненты службы OSGI С тем же интерфейсом

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

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

Компонент1.xml

 <?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="comp1">
   <implementation class="com.demo.impl.CompOneImpl"/>
   <service>
      <provide interface="com.demo.IComponent"/>
   </service>
 </scr:component>

Component2.xml

    <?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="comp2">
   <implementation class="com.demo.impl.CompTwoImpl"/>
   <service>
      <provide interface="com.demo.IComponent"/>
   </service>
 </scr:component>

Доступ к компоненту от потребителя

Использовать компонент

comp1.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp1">
   <implementation class="com.demo.service.ConsumeCompOne"/>
   <reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp1" policy="static" unbind="unsetComp"/>
</scr:component>

comp2.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp2">
   <implementation class="com.demo.service.ConsumeCompTwo"/>
   <reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp2" policy="static" unbind="unsetComp"/>
</scr:component>

когда я пытаюсь получить доступ к comp1 и comp2 соответственно через классы ConsumeCompOne и ConsumeCompTwo, я всегда получаю один и тот же компонент для обоих, comp1 или comp2. Пожалуйста, помогите мне решить эту проблему.

Заранее спасибо

гопи


person user1926519    schedule 27.11.2014    source источник


Ответы (3)


ДС работает корректно, так что тут решать нечего.

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

person Neil Bartlett    schedule 27.11.2014
comment
Что ты имеешь в виду? Тогда моя реализация должна работать правильно? Я создал экземпляр ConsumeCompOne и получил к нему доступ, но иногда он возвращается неправильно. - person user1926519; 27.11.2014
comment
Вы сказали, что ему был предоставлен экземпляр компонента. Так почему же это неправильно? - person Neil Bartlett; 27.11.2014
comment
Я напечатал оба потребительских адаптера, он печатает один и тот же класс реализации, такой как com.demo.impl.CompOneImpl@14e98c44 и com.demo.impl.CompOneImpl@14e98c44 , интересно, как оба экземпляра указывают на одну и ту же реализацию? Я делаю что-то неправильно в конфигурациях? - person user1926519; 27.11.2014
comment
Да, но почему им обоим неправильно указывать на одну и ту же реализацию? Они потребители услуги, почему их волнует, какая реализация предоставляется? Если потребители зависят от определенного класса реализации, то они больше не связаны, и нет смысла использовать сервисы. - person Neil Bartlett; 27.11.2014

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

person Christian Schneider    schedule 27.11.2014
comment
У вас есть пример кода с декларативным доступом через свойства? было бы полезнее - person user1926519; 27.11.2014

Вы хотите использовать атрибут target в элементе reference, чтобы выбрать конкретную службу для привязки.

comp1.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp1">
   <implementation class="com.demo.service.ConsumeCompOne"/>
   <reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp1" policy="static" unbind="unsetComp"
     target="(component.name=comp1)"/>
</scr:component>

comp2.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="consumeComp2">
   <implementation class="com.demo.service.ConsumeCompTwo"/>
   <reference bind="setComp" cardinality="1..1" interface="com.demo.IComponent" name="comp2" policy="static" unbind="unsetComp"
     target="(component.name=comp2)"/>
</scr:component>
person BJ Hargrave    schedule 27.11.2014
comment
УХ ТЫ. это работает нормально. Большое спасибо, ребята, за вашу поддержку. Вы меня спасли ;) Рад - person user1926519; 27.11.2014
comment
БиДжей, я боюсь, что спрашивающий мало что узнал здесь о преимуществах развязки через сервисы... это было причиной того, что я задал вопрос в своем ответе. Ну что ж. - person Neil Bartlett; 02.12.2014