Introduction to OSGi - 2 (OSGi Services)
There are so many OSGi tutorials, blogs, and samples. I am going to add another OSGi sample/tutorial with my OSGi leanings. Here is my previous article regarding OSGi(Introduction to OSGi).
An OSGi Service is a java object instance which is registered with OSGi framework with set of attributes. Services can be accessed via service registry(performed via the class BundleContext). BundleActivator is to be invoked on start and stop. When BundleActivator call start method we are going to register our service. After that any bundle can access that service.
Service Bundle:
In service bundle you need to export your service and need to register it via service registry. When we are exporting service we export interface package only. As usual that is to hide the implementation from the other bundles.
I have created a sample OSGi project called HelloServcie
MANIFEST.MF
Service Interface:
Service Implementation:
Boundle Activater:
When we are using published services, we can import it from another Bundle. So need to create another Plug-In-Project for HelloClient
Bundle Context
Bundle context is the context of a single bundle within the OSGi runtime and it is created when Bundle get started. Bundle context can be used to Install new bundles, Obtain registered services by other bundles and Register services in the framework.
MANIFEST.MF
After importing the bundle, you can access the service. Important thing is service can be accessed only through bundle context. You can get actual service object via BundleContext.getService() method .
Activator class:
For Run this project click on Run --> Run Configuration , In OSGi Framework Right click and create new Run Configuration. Make sure HelloService and HelloClient .
Issues:
What happened if the service is not started when client is accessing the service?
What happened if you have stopped the service bundle?
Code Repo:
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloService
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloClient
An OSGi Service is a java object instance which is registered with OSGi framework with set of attributes. Services can be accessed via service registry(performed via the class BundleContext). BundleActivator is to be invoked on start and stop. When BundleActivator call start method we are going to register our service. After that any bundle can access that service.
Service Bundle:
In service bundle you need to export your service and need to register it via service registry. When we are exporting service we export interface package only. As usual that is to hide the implementation from the other bundles.
I have created a sample OSGi project called HelloServcie
MANIFEST.MF
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: HelloService Bundle-SymbolicName: com.chandana.hello.HelloService Bundle-Version: 1.0.0 Bundle-Activator: com.chandana.hello.helloservice.Activator Bundle-Vendor: CHANDANA Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: org.osgi.framework;version="1.3.0" Export-Package: com.chandana.hello.service Bundle-ActivationPolicy: lazy
Service Interface:
public interface HelloService { public String helloMethods(); }
Service Implementation:
public class HelloServiceImpl implements HelloService { @Override public String helloMethods() { String retValue = "Inside Hello Service method"; return retValue; } }
Boundle Activater:
public class Activator implements BundleActivator { ServiceRegistration serviceRegistration; /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(BundleContext context) throws Exception { System.out.println("Bundle Started.....!!!!!"); HelloService service = new HelloServiceImpl(); serviceRegistration = context.registerService(HelloService.class.getName(), service,null); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { System.out.println("Bundle Stoped.....!!!!!"); serviceRegistration.unregister(); } }
When we are using published services, we can import it from another Bundle. So need to create another Plug-In-Project for HelloClient
Bundle Context
Bundle context is the context of a single bundle within the OSGi runtime and it is created when Bundle get started. Bundle context can be used to Install new bundles, Obtain registered services by other bundles and Register services in the framework.
MANIFEST.MF
Import-Package: org.osgi.framework;version="1.3.0",com.chandana.hello.service
After importing the bundle, you can access the service. Important thing is service can be accessed only through bundle context. You can get actual service object via BundleContext.getService() method .
Activator class:
public class Activator implements BundleActivator { ServiceReference serviceReference; /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(BundleContext context) throws Exception { serviceReference= context.getServiceReference(HelloService.class.getName()); HelloService helloService =(HelloService)context.getService(serviceReference); System.out.println(helloService.helloMethods()); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { context.ungetService(serviceReference); } }context.getServiceReference() method return the HelloService OSGi service reference and Using that service reference can access the actual service object.
For Run this project click on Run --> Run Configuration , In OSGi Framework Right click and create new Run Configuration. Make sure HelloService and HelloClient .
Issues:
What happened if the service is not started when client is accessing the service?
What happened if you have stopped the service bundle?
Code Repo:
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloService
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloClient
Comments
Nice blog! Is there an email address I can contact you in private?