Gestión de dependencias en OSGi
28 Octubre 2008
Anteriormente en este blog hemos dado unos primeros pasos con OSGi, que os recomiendo leer si todavía no lo habéis hecho. Desde esas entradas he actualizado la versión de Apache Felix hasta la 1.2.1.
Ahora llega el momento de echar un vistazo a una de las características más interesantes de Osgi, como es la gestión de dependencias.
Lo primero que debemos conocer es que en OSGi permite exportar e importar paquetes de forma que es el contenedor OSGi el que se encarga de realizar y validar esas dependencias como paso previo a la ejecución de un módulo. Si no se pueden resolver dichas dependencias no se podrá ejecutar el módulo. Para jugar un poco con el tema, he creado dos pequeños módulos:
- Uno que exporta un Logger con funcionalidad avanzada (bueno, no muy avanzada, pero es que es un ejemplo) cuyo código vemos a continuación. Este módulo también tiene un BundleActivator que saca una traza tanto en el arranque como en la parada.:
package org.tcymu.osgi.log.logger;
public class Logger {
public void log(String msg) {
System.out.println(System.currentTimeMillis() + ": " + msg);
}
}
- Otro que importa dicho Logger para hacer uso de él:
package org.tcymu.osgi.app;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.tcymu.osgi.log.logger.Logger;
public class AppBundle implements BundleActivator {
Logger logger = new Logger();
public void start(BundleContext arg0) throws Exception {
logger.log("Arrancando AppBundle");
}
public void stop(BundleContext arg0) throws Exception {
logger.log("Parando AppBundle");
}
}
Tanto la exportación como la importación de los paquetes se hace a través de los descriptores. Las líneas importantes son:
Bundle-SymbolicName: org.tcymu.osgi.log.LogBundle Bundle-Version: 1.0.0 Bundle-Activator: org.tcymu.osgi.log.LogBundle Import-Package: org.osgi.framework Export-Package: org.tcymu.osgi.log.logger;version="1.0.0"
y en la importación:
Bundle-SymbolicName: org.tcymu.osgi.app.AppBundle Bundle-Version: 1.0.0 Bundle-Activator: org.tcymu.osgi.app.AppBundle Import-Package: org.osgi.framework,org.tcymu.osgi.log.logger;version="1.0.0"
Empaquetaremos ambos módulos tal y como vimos en la anterior entrada. Ahora vamos a probar la instalación. Primero en el orden correcto. Primero instalo el módulo de log y después la aplicación:
install file:////d:/felix-1.2.1/bundle/org.tcymu.osgi.log.logbundle-1.0.0.jar Bundle ID: 16 install file:////d:/felix-1.2.1/bundle/org.tcymu.osgi.app.appbundle-1.0.0.jar Bundle ID: 17 start 16 start 17 Todo funciona correctamente. Ahora podemos hasta desinstalar el módulo de log, que una vez exportado, el contenedor mantiene una copia de esas clases para ofrecerlas a quien las necesite. Ahora vamos a parar y desinstalar nuestros módulos. También paro y reinicio Felix, ya que quiero comprobar qué ocurre si no tenemos una dependencia. Si instalo sólo el módulo de aplicación e intento arrancar, me lanza el siguiente error:
org.osgi.framework.BundleException: Unresolved constraint in bundle 24: package; (&(package=org.tcymu.osgi.log.logger)(version>=1.0.0))
Voy a dejar para una segunda parte de esta entrada el crear nuevas versiones de los módulos y comprobar cómo ser gestionan en el contenedor.
Actualización: Segunda parte
1 Comment Add your own
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed






1. Gestión de servicios en OSGi « Tus ceros y mis unos | 22 Diciembre 2008 at 9:47 pm
[...] Diciembre 2008 Anteriormente hemos visto en este blog la gestión de dependencias en OSGi. En esta entrada vamos a ver OSGi desde el punto de vista de un [...]