In blueprint.xml
, I declare an optional dependency this way:
<reference id="RepositoryListener"
interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener"
availability="optional" />
<bean id="Repository"
class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl">
<jpa:context property="entityManager" unitname="ODP_Server" />
<tx:transaction method="*" value="Required" />
<property name="repositoryListener" ref="RepositoryListener" />
</bean>
and in RepositoryImpl
, I have
public void setRepositoryListener(RepositoryListener repositoryListener) {
logger.info("Repository listener set");
this.repositoryListener = repositoryListener;
}
This method is called by Blueprint even when there is no RepositoryListener
service available, as expected. The problem is, how can I check later whether there is a service?
if (repositoryListener != null) {
repositoryListener.notifyDelete(node);
} else {
logger.warn("No repository listener set!");
}
doesn't work, since repositoryListener
isn't null
, but a Blueprint proxy.
There are three options.
ServiceUnavailableException
. So one option is to set a very short blueprint timeout, and catch the ServiceUnavailableException. To set a shorter timeout, just add an attribute to your optional service reference:
<reference
id="someReference"
interface="org.some.service.ServiceInterface"
availability="optional"
timeout="100" />
To use a reference listener, you'd add something like the following to your blueprint xml (there's a more detailed example and discussion in chapter 6 of Enterprise OSGi in Action):
<reference
id="someReference"
interface="org.some.service.ServiceInterface">
<reference-listener
ref="someBean"
bind-method="bind"
unbind-method="unbind" />
</reference>
The bind
and unbind
methods are called as your service appears and disappears (or as services get added and removed to your reference list, if you're using a reference list).
Using a reference list doesn't really need a code example - just use a <reference-list
element and ensure your setter method takes a List.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With