How to use OSGi bundle services dynamically

  • Follow


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.

0
Reply Schwede 10/29/2007 12:44:07 PM

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.
> 
0
Reply Kai 11/14/2007 12:23:07 PM


1 Replies
314 Views

(page loaded in 0.068 seconds)

Similiar Articles:













7/23/2012 11:21:39 AM


Reply: