Как я могу сослаться на все компоненты, реализующие данный интерфейс?

Я использую среду выполнения компонента службы Apache Felix (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