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