Introduction to OSGi(Java Modular)

OSGi Alliance is the governing body of this stranded and it was started at 1999. their initial goal was create open stranded for network devices. Based on this idea this specification introduced for Java also. Eclipse was first in Java. they introduced OSGi based Eclipse IDE at 2004 June.
OSGi is way to define dynamic module in java. There are main three OSGi container implemented for Java,such as Apache Felix, Eclipse Equinox and Knopflefish.

Why OSGi? Because OSGi provide ability to divided application in to multiple module and those module easy to manage with other dependencies. other than that is very easy to install, update,stop and delete module without stop engine(Ex: Tomcat web application container). We can have multiple version of implementation with effecting to other references.

There are main 3 layers in web based Java framework(Presentation , Business layer and  DAO layer). There we can divide it into three OSGi based module. then we can very easily fixed bug in one layer with out effecting to others and restarting our Web container. Just we need to update out module.

in OSGi world output is bundle, it can be either Jar or War file. A bundle consists of Java classes and other resources that with some additional metadata (providing services and packages to other bundles).

I am going to use Eclipse IDE for create my first bundle. Because Eclipse IDe has built in Equinox container(every eclipse plugins are OSGi bundles) . 

Create Eclipse Plug-In-Project

  1. Go to New--> Other --> Plug-In-Project and click on Next then new project creation dialog will be appeared

  2. Provide project name and Target platform as below. and Click on Next
  3.        Project name     : com.chandana.Hello.HelloWorld
           Target platform : select Stranded OSGi

  4. In next screen you can change bundle information(These information available in MANIFEST.MF  and I will give details information later) then click on Next button.

  5. After that OSGi project template selection dialog will be appear.There select  Hello OSGi Bundle and click on Finish

After few second Eclipse will generate Hello World Plug-In-Project(I had Not responding few second :) )

In my project structure is like this:


Activator.java

package com.chandana.hello.helloworld;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

 /*
  * (non-Javadoc)
  * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
  */
 public void start(BundleContext context) throws Exception {
  System.out.println("Hello World!!");
 }
 
 /*
  * (non-Javadoc)
  * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
  */
 public void stop(BundleContext context) throws Exception {
  System.out.println("Goodbye World!!");
 }

}

Activator is class which implement BundleActivator  interface. It has stop and start methods. those methods are called when a bundle is started or stopped. This bundle activator class specify in MENIFEST.MF file(Bundle-Activator entry).

Start Method:
The OSGi container calls start method when bundle is starting. We can use this start method for initialized database connection, register a service for other bundle use.
Stop Method:
The OSGi container calls stop method when bundle is stopping. We can use this method for remove services form service registry like clean up process

MANIFEST.MF


Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld
Bundle-SymbolicName: com.chandana.Hello.HelloWorld
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.chandana.hello.helloworld.Activator
Bundle-Vendor: CHANDANA
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"

Bundle-ManifestVersion
Bundle-ManifestVersion header show the OSGi container that this bundle follows the rules of the OSGi specification. A value of 2 means that the bundle is compliant with OSGi specification Release 4; a value of 1 means that it is compliant with Release 3 or earlier. 

Bundle-Name
  Bundle-Name header defines a short readable name for bundle. 

Bundle-SymbolicName
   Bundle-SymbolicName header specifies a unique name for the bundle. This is the name you will use while referring a given bundle from other bundles.

Bundle-Version
    Bundle-Version header is the version number of the bundle.

Bundle-Vendor
    Bundle-Vendor header is description of the vendor(foe example it's my name).

Import-Package
    Import-Package is indicate what are the other Java bundle(OSGi) required for this bundle. what we called dependency. 
Export-Package
    Export-Package is indicate what are public packages in bundle and those Export-Package can import from other bundle.





Run the Bundle:

  1. For Run this project click on Run --> Run Configuration , In OSGi Framework  Right click and create new Run Configuration


  2. First unchecked the all target platform and Click on Add Required Bundles.
  3. After that Apply the changes and Run the project by click in  Run button.
  4.  After Run the project OSGi console display like below.

OSGi Terminal Commands:

start      - start the specified bundle(s)
stop       - stop the specified bundle(s)
uninstall  - uninstall the specified bundle(s)
update     - update the specified bundle(s)
refresh    -  refresh the packages of the specified bundles
b          - display details for the specified bundle(s)
headers    - print bundle headers
services   -  display registered service details

Source Code

In My Next post I will describe how to create dependency based OSGi bundle.

Comments

Osgi is something I always look to learn more and use in real project, hasn't done yet. Capability of Osgi is immense and that's what is shown here also. looking for some more Osgi examples and articles.

Thanks
How HashMap works in Java

Popular posts from this blog

XSLT - Modify Date and DateTime value

Integrate With Mutual Certificate Authentication based Service

Yield Price Sri Lanka - Android Application