Search code examples
javaspringosgieclipse-virgoblueprint-osgi

Blueprint List of Services: Wait for all services


I am Using Eclipse Virgo/Gemini Blueprint and have an Interface with multiple implementations:

Implementation 1:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<bean id="MyID1"
    class="ImplementationCLass1">
</bean>

<service ref="MyID1"
    interface="MyInterface" />

Implementation 2:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<bean id="MYID2"
    class="ImplementationClass2">
</bean>

<service ref="MYID2"
    interface="MyInterface" />

Implementation 3:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<bean id="MyID3"
    class="ImplementationClass3">
</bean>

<service ref="MyID3"
    interface="MyInterface" />

And a Client:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<reference-list id="MyImplementations"
    interface="MyInterface" />

<bean id="clientID" class="ClientClass"
    init-method="startUp">

    <property name="services" ref="MyImplementations"></property>

</bean>

The startUp method is a simple method which iterates over the whole list and prints out a simple string (for testing purpose)

The Problem is if i install the client Bundle only two out of tree Services are in my List. If i stop and start the Bundle again, all three Services are in my List.

Any ideas/sugesstions why?

Is it possible to tell virgo that the list MUST contain all Services matching MyInterface?

If you need additional information feel free to ask


Solution

  • The content of the reference list is dynamic, items will be added and removed as matching services comes and goes. But you can implement a reference listener that is notified when the list changes to keep track of available services. Se discussion and examples here.