2015-06-22 121 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指出,我被提到的日誌消息誤導了。相應的服務啓動需要很長時間,但最終他們綁定正確。

相關問題