Я использую среду выполнения компонента службы 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
).
Итак, вопрос в том, как я могу динамически ссылаться на компоненты, которые предоставляют реализации для данного интерфейса, игнорируя их имена?
org.example.Producer
. Этого нигде не сказано. Ищет службы типаorg.example.Producer
. - person Neil Bartlett   schedule 22.06.2015org.example.Producer
услуг? Когда DS не может привязаться к службе, наиболее распространенной причиной является то, что служба не существует! - person Neil Bartlett   schedule 22.06.2015