For Programmers: Free Programming Magazines  


Home > Archive > Java Help > November 2007 > How to use OSGi bundle services dynamically









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author How to use OSGi bundle services dynamically
Schwede

2007-10-29, 8:13 am

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_se...orial.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.

Kai Edinger

2007-11-14, 8:12 am

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_se...orial.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.
>

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com