2014-11-27 9 views
0

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

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

Component1.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. Пожалуйста, помогите мне решить эту проблему.

Thankyou заранее

gopy

ответ

1

DS работает правильно, так что нет ничего, чтобы решить здесь.

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

+0

Что вы имеете в виду? Тогда моя реализация должна работать правильно? Я создал экземпляр ConsumeCompOne и обратился к нему, но он возвращается неправильно некоторое время. – user1926519

+0

Вы сказали, что ему предоставлен экземпляр компонента. Так почему же это неправильно? –

+0

Я напечатал как потребительский адаптер, он печатает тот же класс реализации, что и [email protected] и com.demo.impl.CompOneImpl @ 14e98c44, интересно, как оба экземпляра указывают одну и ту же реализацию? Могу ли я ошибаться в конфигурациях? – user1926519

1

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

+0

У вас есть образец кода с декларативным доступом через свойства? было бы более полезно – user1926519

1

Вы хотите использовать атрибут 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> 
+0

WOW. это работает нормально. Большое вам спасибо за вашу поддержку. вы, ребята, спасли меня;) Glad – user1926519

+1

BJ, мой страх - это вопрос, который многому не научился здесь о преимуществах развязки через сервисы ... это послужило поводом для линии анкетирования, которую я принял в своем ответе. Ну что ж. –