Java Reference
In-Depth Information
<bean
scope ="bundle"
id="greeterService"
class="com.apress.springenterpriserecipes.osgi.helloworld.service.GreeterServiceImpl"/>
<osgi:service interface="com.apress.springenterpriserecipes.osgi.
➥
helloworld.service.GreeterService" ref="greeterService" />
The OSGi runtime surfaces events based on the life cycle of services. You can register a listener to
react to the life cycle of a service. There are two ways to do this, one using anonymous inner beans and
one using a named reference.
<osgi:service id="greeterServiceReference"
interface="com.apress.springenterpriserecipes.osgi.helloworld.
➥
service.GreeterService">
<registration-listener registration-method="greeterServiceRegistered"
unregistration-method="greeterServiceUnRegistered">
<bean class="com.apress.springenterpriserecipes.osgi.helloworld.service.
➥
GreeterServiceLifeCycleListener"/>
</registration-listener>
</osgi:service>
Spring Dynamic Modules is relatively flexible with respect to the prototype of the method:
public void serviceRegistered( ServiceInstance serviceInstance, Map serviceProperties)
public void serviceUnregistered(ServiceInstance serviceInstance, Dictionary
serviceProperties)
Naturally, there's a similar feature for client-side proxies. The feature is a listener on the
osgi:reference
element. Here, we use an inner bean inside the
osgi:listener
element, though
you can also use the
ref
attribute on the
osgi:listener
element and avoid the inner bean if you wish.
<osgi:reference id="greeterService"
interface="com.apress.springenterpriserecipes.osgi.
➥
helloworld.service.GreeterService">
<osgi:listener bind-method="greeterServiceOnBind"
unbind-method="greeterServiceOnUnbind" >
<bean class = "com.apress.springenterpriserecipes.osgi.
➥
helloworld.client.GreeterClientBindListener"/>
</osgi:listener>
</osgi:reference>
Spring Dynamic Modules also supports injection and manipulation of bundles themselves. An
injected bundle is of type
org.osgi.framework.Bundle
instances. The simplest use case is that you want
to obtain an instance of the
org.osgi.framework.Bundle
class from an already loaded bundle in the
system. You specify the symbolic name to help Spring look it up. The
Symbolic-Name
is a
MANIFEST.MF
attribute that every bundle should specify. Once acquired, the Bundle can be interrogated to introspect
information about the bundle itself, including any entries, its current state (which can be any of:
UNINSTALLED
,
INSTALLED
,
RESOLVED
,
STARTING
,
STOPPING
, or
ACTIVE
), and any headers specified on the
bundle. The Bundle class also exposes methods to dynamically control the life cycle of the bundle, in
much the same way as you might from the Equinox shell. This includes things like stopping a bundle,
starting it, uninstalling it, and updating it (that is, replacing it with a new version at runtime, for
example.)
Search WWH ::
Custom Search