OSGI服务组件具有相同的接口

时间:2014-11-27 09:16:19

标签: osgi equinox declarative-services

我需要创建具有相同接口的服务组件。这意味着我有相同的接口不同的实现。我尝试创建两个具有相同接口的组件,其中一个只有一个活动。

我正在使用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>

当我尝试通过ConsumeCompOne和ConsumeCompTwo类分别访问comp1和comp2时,我总是为comp1或comp2获得相同的组件。请帮我解决这个问题。

提前谢谢

gopy

3 个答案:

答案 0 :(得分:1)

DS工作正常,所以这里无需解决。

正如您所说,两个消费者组件都提供了IComponent服务的实例,这正是他们作为参考请求的。

答案 1 :(得分:1)

如果您希望能够选择服务的特定实例,则使用属性发布它以识别它。然后,在客户端上,您可以使用OSGi服务过滤器来选择与之匹配的过滤器。一个特殊的键/值组合。

答案 2 :(得分: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>