09 mayo 2010

OSGi (First Steps)

Decidí hacer este post porque no encontré ningun tutorial que nos explique OSGi desde cero, aclaro que en este post haremos una introducción para que después podamos continuar con algo más avanzado.

¿Que es OSGi?
OSGI (Open Services Gateway Initiative), podríamos definirlo como un sistema (o framework) modular para Java que establece las formas de crear módulos y la manera en que estos interactuaran entre sí en tiempo de ejecución. OSGi intenta solventar los problemas del tradicional "classloader" de la máquina virtual y de los servidores de aplicaciones Java. En OSGI, cada módulo tiene su propio classpath separado del resto de classpath de los demás módulos.

Este framework proporciona a los desarrolladores un entorno orientado a servicios y basado en componentes, ofreciendo estándares para manejar los ciclos de vida del software.
OSGi esta divido en capas que en proximo post iremos cubriendo por ahora se mencionan para que se conozca la existencia de ellas.

Security Layer.
Module Layer.
Life Cycle Layer.
Service Layer.
Execution Environment.

OSGi Alliance
La OSGi Alliance es un consorcio de empresas tecnológicas a nivel mundial que trata de asegurar la interoperabilidad de las aplicaciones y servicios basados en esta plataforma entre las empresas que componen este consorcio, podemos encontrar compañías de diversa índole: automoción, aeronáutica, fabricantes de electrodomésticos, telecomunicaciones, fabricantes de teléfonos... Algunos ejemplos de miembros: Motorola, Nokia, Mitsubishi Electric Corporation, Vodafone Group Services, LinkedIn, LG Electronics...
La alianza proporciona las especificaciones, las implementaciones de referencia, las suites de prueba y la certificación.

Especificacion OSGi
OSGI proporciona un marco de trabajo java de uso general, seguro y administrado que
soporta el despliegue dinámico de aplicaciones conocidas como "Bundles" o módulos.
Algunas de las características que componen este marco de trabajo:

  • Es un sistema de módulos para la plataforma java.
  • Incluye reglas de visibilidad, gestión de dependencias y versionado de los bundles.
  • Es dinámico.
  • La instalación, arranque, parada, actualización y desinstalación de bundles se realiza dinámicamente en tiempo de ejecución sin tener que detener por completo la
    plataforma.
  • Se trata de una arquitectura orientada a servicios.
  • Los servicios pueden ser registrados y consumidos dentro de la VM.
Implementacones OSGi
Lo bueno de tener una aplicación modular es que a diferencia de una aplicación web nosotros vamos deployando unidades independientes las cuales se pueden cambiar con gran facilidad, esto quiere decir que si necesitáramos reemplazar un modulo por otro muchas veces no sería necesario detener toda la aplicación sino ciertos módulos y todo seguiría andando, además tenemos versionado de Bundles (Módulos) lo cual es muy útil para poder ir haciendo que nuestros módulos usen otros pero de alguna versión especifica.
Podemos encontrar varias plataformas certificadas en OSGi las cuales cumplen con la especificación de modo que si nosotros desarrolláramos nuestros módulos ellos podrían correr en cualquiera de estas implementaciones, algunas de ellas son:
  • Apache Felix.
  • Eclipse Equinox.
  • Knopflerfish.
  • Newton Project.
Preparando mi entorno OSGi
Para este post utilizaremos la implementación de Eclipse Equinox para nuestros ejemplos, nos dirigimos a Eclipse Equinox desde aquí podremos realizar la descarga del entorno de trabajo, tenemos varias opciones:

Descarga de la implementación OSGI base: Se trata de un fichero .jar (bundle),
que contiene los elementos básicos para poder ejecutar nuestro entorno.

Descarga completa de equinox: Se trata de un fichero .zip que contiene el bundle
base comentado anteriormente, más todas las configuraciones e implementaciones
de los servicios OSGI.

Descarga de los bundles opcionales: Mediante esta opción podremos descargar
uno a uno los bundles de equinox que implementan los diferentes servicios de
OSGI.

Para este ejemplo bajaremos la descarga completa para facilitar las cosas, luego podremos descomprimir este zip en nuestro disco. Dentro de la carpeta plugins del zip que descargamos encontraremos un jar llamado org.eclipse.osgi_3.x.x_xxx.jar el cual es util para dos cosas la primera levanta el entorno OSGi y desde aqui podremos instalar, iniciar, detener, desinstalar nuestros módulos, y además podremos usar este jar para desarrollar en el eclipse ya que contiene las clases/interfaces de la implementación OSGi. Les dejo un print screen de mi eclipse con el desarrollo del ejemplo que sigue.

OSGiEclipse.png

Ejemplo Basico
Como es típico empezaremos con un Hello World, ósea aquí no estaríamos construyendo una aplicación que nos diga Hello World sino que estaríamos creando un modulo el cual por vivir en un contender OSGi tiene un ciclo de vida completo. Básicamente crear un modulo sería crear un jar con nuestras clases y un archivo MANIFEST.MF

Entendiendo el MANIFEST.MF
El Manifesft.mf no es más que un archivo de texto en el cual se agregan directivas del tipo clave: valor, las cuales juegan un papel muy importante ya que son las que irán diciéndole al marco de trabajo OSGi algunas de las cosas importante sobre nuestro modulo a continuación muestro un Manifest de ejemplo y explico sus directivas.

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld
Bundle-SymbolicName: com.javacuriosities.osgi.helloworld
Bundle-Version: 1.0.0
Bundle-Activator: com.javacuriosities.osgi.helloworld.Activator
Import-Package: org.osgi.framework;specification-version="1.4.0"
Manifest-Version
Define la versión del archivo MANIFEST.MF.

Bundle-ManifestVersion
Indica la especificación de OSGi sobre la que está basada el bundle. Por defecto, si no se indica nada, el valor es 1. Este valor indica que el bundle se basa en las reglas de la especificación OSGI 3. Si tiene valor 2, se tratará de la especificación de OSGI 4.

Bundle-Name
Indica el nombre corto del Bundle debe ser human-readable.

Bundle-SymbolicName
Esta etiqueta define un nombre único para el bundle. Con este nombre es con el que trabajaremos en el entorno de ejecución.

Bundle-Version
Indica la versión de nuestro bundle, dentro de nuestro entorno podríamos tener diferentes versiones de un mismo bundle.

Bundle-Activator
Indica que clase funcionara como Activator, la cual es una clase que debe implementar la interfaz BundleActivator de modo que podamos entrar dentro del ciclo de vida de nuestro Bundle.

Import-Package
Por medio de esta directiva le decimos que paquetes queremos importar, si nos ponemos a pensar esta línea es muy importante porque nuestro jar solamente tendra nuestras clases pero por ejemplo la interfaz BundleActivator ya es parte del modulo core de OSGi asi no estaría dentro de nuestro jar así que por medio de esta directiva la importamos para que todo funcione.

Implementando nuestro Activator

package com.javacuriosities.osgi.helloworld;

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

public class Activator implements BundleActivator{
@Override
public void start(BundleContext arg0) throws Exception {
 System.out.println("Hello World"); 
}

@Override
public void stop(BundleContext arg0) throws Exception {
 System.out.println("Bye Bye"); 
}
}
Empaquetando e instalando
Luego de poder crear nuestro modulo deberemos empaquetarlo como un jar podríamos usar el eclipse o el comando jar que viene con java, el jar nos debería quedar de la siguiente forma

com.javacuriosities.osgi.helloworld_1.0.0.jar
    com\javacuriosities\osgi\helloworld\Activar.class
    META-INF\MANIFEST.MF
Debemos iniciar nuestro entorno OSGi para esto haremos lo siguiente iremos al directorio donde descomprimimos el entorno Eclipse Equinox y dentro de la carpeta plugins ejecutaremos la siguiente línea de comando, luego veremos que el prompt cambia a osgi> y ahí pondremos ss para ver nuestros bundles instalados.

java -jar org.eclipse.osgi_3.x.x_xxx.jar -console

Ahora instalaremos nuestro bundle(.jar) copiaremos nuestro bundle al Disco C:\ y ejecutaremos el comando

install file:c:\com.javacuriosities.osgi.helloworld_1.0.0.jar

si todo va bien aparecerá un mensaje del tipo Bundle id is XX, ahora con este id ya podremos iniciar, detener y desinstalar nuestro modulo. Para probar ejecutaremos estos dos comandos.

start XX --> Ahi veremos nuestro mensaje del método start de la clase Activator.
stop XX --> Ahi veremos nuestro mensaje del método stop de la clase Activator.

Adjunto un screen de la consola con los comandos.

OSGiConsole.png

Bueno esto ha sido por este post, espero haber sido lo suficientemente claro para que se entienda el ejemplo y los conceptos básicos de OSGi, cualquier pregunta o sugerencia es bien recibida.

Saludos y hasta pronto.

8 comentarios:

  1. Anónimo4/8/10, 4:45

    muchas gracias amigo, me ayudaste a entender los principios que necesitaba. Un saludo grande. Adios.

    ResponderEliminar
  2. Excelente introducción. Concreta y sencilla. Muchas gracias.

    ResponderEliminar
  3. Gracias por los comentarios, Saludos

    ResponderEliminar
  4. Excelente introducción.
    Gracias

    ResponderEliminar
  5. Genial aportación!!
    Gracias

    ResponderEliminar
  6. Genial. Gracias, yo de esto no sabia nada. Muy útil.

    ResponderEliminar