Как мога да реферирам всички компоненти, които реализират даден интерфейс?

Използвам Apache Felix Service Component Runtime (SCR) в среда на Eclipse Equinox OSGi.

Има няколко декларирани компонента, които реализират интерфейса 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>

Сега в друг компонент обичам да споменавам всички онези компоненти, които внедряват интерфейса 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.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.ProducerA, org.example.ProducerB).

Така че въпросът е как мога динамично да реферирам компоненти, които осигуряват реализации за даден интерфейс, като игнорирам техните имена?


person 0x7d7b    schedule 22.06.2015    source източник
comment
Не търси компоненти с името org.example.Producer. Това никъде не го пише. Търси услуги от тип org.example.Producer.   -  person Neil Bartlett    schedule 22.06.2015
comment
Няма нищо очевидно нередно във вашия пример и съобщението, което цитирате, не е непременно грешка (то просто казва СЪОБЩЕНИЕ). Какви реални ефекти можете да видите? Публикувана ли е някоя от org.example.Producer услугите? Когато DS не може да се свърже с услуга, най-честата причина е, че услугата не съществува!   -  person Neil Bartlett    schedule 22.06.2015
comment
Опитайте с внедряване, подобно на предоставената проба тук.   -  person d33t    schedule 22.06.2015
comment
@d33t Благодаря, но го разбрах, че вече работи, както можете да прочетете в отговора ми.   -  person 0x7d7b    schedule 22.06.2015


Отговори (1)


Бях подведен от споменатото лог съобщение, както посочи Нийл Бартлет. Просто стартирането на съответните услуги отне много време, но в крайна сметка бяха обвързани правилно.

person 0x7d7b    schedule 22.06.2015