2015-06-22 117 views
1

我在Eclipse Equinox OSGi环境中使用Apache Felix服务组件运行时(SCR)。如何引用实现给定接口的所有组件?

有几个组件宣布实施org.example.Producer喜欢这个界面:在我喜欢引用那些实现该接口org.example.Producer动态组件的其他组件

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.example.ProducerA"> 
    <implementation class="org.example.ProducerA"/> 
    <service> 
     <provide interface="org.example.Producer"/> 
    </service> 
</scr:component> 

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.example.ProducerB"> 
    <implementation class="org.example.ProducerB"/> 
    <service> 
     <provide interface="org.example.Producer"/> 
    </service> 
</scr:component> 

现在:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.example.ConsumerA"> 
    <implementation class="org.example.ConsumerA"/> 
    <reference bind="bindProducer" cardinality="0..n" interface="org.example.Producer" policy="dynamic" unbind="unbindProducer"/> 
    <service> 
     <provide interface="org.example.Consumer"/> 
    </service> 
</scr:component> 

但这会在运行时发生错误。看来,SCR包括组件名称为它的搜索过滤器:

!ENTRY org.eclipse.equinox.ds 1 0 2015-06-22 11:31:31.781 
!MESSAGE Could not bind a reference of component org.example.ConsumerA. The reference is: Reference[name = org.example.Producer, interface = org.example.Producer, policy = dynamic, cardinality = 0..n, target = null, bind = bindProducer, unbind = unbindProducer] 

正如你在错误信息看它与名称org.example.Producer明确搜索组件。但是,上面列出的组件中没有一个具有该名称(org.example.ProducerAorg.example.ProducerB)。

所以问题是如何动态引用组件,通过忽略它们的名称为给定接口提供实现?

+1

它不搜索名称为“org.example.Producer”的组件。它在任何地方都没有说过。它正在寻找** type **'org.example.Producer'的服务。 –

+1

你的例子没有什么明显的错误,你引用的消息不一定是错误(毕竟它只是说“MESSAGE”)。你能看到什么样的实际效果?是否发布了任何'org.example.Producer'服务?当DS无法绑定到服务时,最常见的原因是服务不存在! –

+0

尝试使用类似于[在此提供的示例]的实现(https://github.com/Adobe-Consulting-Services/acs-aem-samples/blob/master/bundle/src/main/java/com/adobe/ ACS /样品/服务/ IMPL/SampleMultiReferenceServiceImpl.java)。 – d33t

回答

0

Neil Bartlett指出,我被提到的日志消息误导了。相应的服务启动需要很长时间,但最终他们绑定正确。

相关问题