Re: How to use OSGi bundle services dynamically
hi,
the way you have chossen, is the "bad way". It shoud works, the best
practices is using the org.osgi.util.tracker.ServiceTracker and
org.osgi.util.tracker.ServiceTrackerCustomizer.
For example something like that:
public class Activator {
private ServiceTracker tracker;
public void
start(BundelContext context) {
final BundleContext myContext = context;
tracker = new ServiceTracker( context,
"com.example.http.service",
new ServiceTrackerCustomizer() {
public Object
addingService(ServiceReference reference)
{
// Do something if add
return myContext.getService(reference);
}
public void
modifiedService(ServiceReference reference,
Object service)
{
// Do something if service is modified
}
public void
removedService(ServiceReference reference,
Object service)
{
// Do something if service is removed
}
} );
tracker.open();
public void
start(BundelContext context)
}
tracker.close();
}
}
Schwede schrieb:
hi all,
i have a little problem here finding out how to use registered
services in OSGi.
what i am doing is the followig:
- register/provide services with
context.registerService(... , ... , null);
in each of the "service providing" Activator classes (means: the
bundles)
- set up a "managing" bundle with a ServiceListener in the Activator
class
m_context.addServiceListener(this);
that (un)registers provided services on-the-fly.
now i have implemented my serviceChanged method like below
public void serviceChanged(ServiceEvent event)
{
try
{
String[] objectClass = (String[])
event.getServiceReference().getProperty("objectClass");
if (event.getType() == ServiceEvent.REGISTERED)
{
System.out.println("Service " + objectClass[0] + " registered.");
}
else if (event.getType() == ServiceEvent.UNREGISTERING)
{
System.out.println("Service " + objectClass[0] + "
unregistered.");
}
else if (event.getType() == ServiceEvent.MODIFIED)
{
System.out.println("Ex1: Service of type " + objectClass[0] + "
modified.");
}
}
catch(RuntimeException re)
{
System.out.println("RuntimeException :: " + re.getMessage());
System.out.println(re.getStackTrace());
}
}
here is a rather nice tutorial (even though i do not use felix/
knopflerfish - i am using Eclipse/Equinox) that shows an example on
how to get use of a registered service from another bundle:
http://www.knopflerfish.org/osgi_service_tutorial.html#best
now my question is: how do i dynamically "use" my services? right now
it seems to me that on the one hand i can (un)register services on-the-
fly but on the other i always have to make sure that the service i
want to use is currently registered. this sounds like i have to use a
hell of a lot if-clauses or switch-case... at least if i am following
that tutorial from above.
for example I have a bundle providing a xml validation service and a
xml parsing service. another bundle is just for logging purpose and so
on...
how would you implement a project like this? is it even useful to have
a "managing bundle" or should i add a ServiceListener to each of my
providing bundles to share funcionality under each other.