Service publication and service listener notification
Hi,
I am looking for help in deciphering following issue.
If service listener and service publication happens in the same bundle, order of beans in spring-config is important.
Example 1:
If service is published after osgi:list with osgi:listener, listener is invoked properly.
Code:
<osgi:list id="menuContributions" interface="shared.ui.menu.MenuContribution" cardinality="0..N">
<osgi:listener bind-method="onBind" unbind-method="onUnbind">
<bean class="shared.ui.menu.support.MenuContributionListener">
<constructor-arg ref="menuBuilder"/>
</bean>
</osgi:listener>
</osgi:list>
<osgi:service ref="hostMenuContribution" interface="shared.ui.menu.MenuContribution">
<osgi:service-properties>
<entry key="publisher" value="HOST"/>
</osgi:service-properties>
</osgi:service>
Example 2:
If service is published (osgi:service) before listener (osgi:list with osgi:listener), listener is not notified.
Code:
<osgi:service ref="hostMenuContribution" interface="shared.ui.menu.MenuContribution">
<osgi:service-properties>
<entry key="publisher" value="HOST"/>
</osgi:service-properties>
</osgi:service>
<osgi:list id="menuContributions" interface="shared.ui.menu.MenuContribution" cardinality="0..N">
<osgi:listener bind-method="onBind" unbind-method="onUnbind">
<bean class="shared.ui.menu.support.MenuContributionListener">
<constructor-arg ref="menuBuilder"/>
</bean>
</osgi:listener>
</osgi:list>
From looking at the source code of org.springframework.osgi.service.importer.support. internal.collection.OsgiServiceCollection, I would expect a call to OsgiListenerUtils.addServiceListener() to nullify the need for order of beans.
From OsgiServiceCollection.
Code:
// now get the already registered services and call the listener
// (the listener should be able to handle duplicates)
dispatchServiceRegistrationEvents(OsgiServiceReferenceUtils.getServiceReferences(context, filter), listener);
I debugged through the code and I actually do see published service with correct properties in the Framework service registry. But a call to bundleContext.getServiceReferences with a proper filter returns a null.
Is there some timing issue that I am stumbling into? Felling very obtuse.
p.s. This might be a spring-dm question, but I am seeing it in the server so posting here.
Environment: dm-server 2 RC1, spring.dm 1.2.1, springframework 3 RELEASE