Home > Desarrollo de Software > ServiceMix 4.2 en Tomcat6

ServiceMix 4.2 en Tomcat6

ServiceMix

Este fin de semana estuve “destripando” ServiceMix, específicamente la distribución 4.2.0-fuse-02-00 de Fuse. El objetivo era generar un war desplegable en Tomcat6, ya que la versión de Fuse sólo viene como aplicación standalone.

Al final fue no fue tan complicado, porque hay un ejemplo que facilita enormemente la tarea.

Al grano

Para ejecutivos de tiempo escaso, estos son los pasos a seguir.

Supuestos:

  • Linux, distribución Ubuntu Karmic x86_64.
  • Tomcat6 instalado vía apt (relevante, porque determina rutas, permisos y usuario tomcat6).
  • estar conectado a internet (se bajarán componentes en la instalación).

Pasos:

  • Baja el war karaf-smx-1.4.0-fuse-02-00.war
  • Como root, crea el directorio .karaf en el home de tomcat6: mkdir /usr/share/tomcat6/.karaf
  • Cambia el owner de .karaf a tomcat6: chown tomcat6:tomcat6 /usr/share/tomcat6/.karaf
  • Crea un link a etc en el directorio de trabajo de tomcat: ln -sf /var/lib/tomcat6/webapps/karaf-smx/WEB-INF/karaf/etc /var/lib/tomcat6/etc
  • Despliega el war: cp /path/to/karaf-smx-1.4.0-fuse-02-00.war /var/lib/tomcat6/webapps/karaf-smx.war

Ahora deberás esperar un buen rato, porque Karaf empezará a bajar e instalar los bundles de ServiceMix. Puedes ir vigilando lo que pasa en el log:

$ tail -f /var/lib/tomcat6/webapps/karaf-smx/WEB-INF/karaf/data/log/servicemix.log

Para verificar que todo está listo, abre una consola (el password es smx):

$ ssh -p 8101 -l smx localhost

Ejecuta el comando list, para ver los bundles instalados:

smx@root> list
START LEVEL 100
   ID   State         Blueprint      Spring    Level  Name
[   0] [Active     ] [            ] [       ] [    0] OSGi System Bundle (3.5.1.R35x_v20090827)
[   1] [Active     ] [            ] [       ] [    5] OPS4J Pax Url - mvn: (1.1.2)
[   2] [Active     ] [            ] [       ] [    5] OPS4J Pax Url - wrap: (1.1.2)
...
[ 173] [Active     ] [            ] [       ] [   60] Apache ServiceMix Bundles: commons-io-1.3.2 (1.3.2.3)
[ 174] [Active     ] [            ] [       ] [   60] camel-cxf (2.2.0.fuse-02-00)
[ 175] [Active     ] [            ] [       ] [   60] camel-jms (2.2.0.fuse-02-00)
smx@root>

Cuando sean 175 debería esta todo listo para la acción :D .

Explicación

El war de arriba es una versión modificada del proyecto web, ubicado en examples/karaf-demos. El código fuente lo puedes bajar desde karaf-smx-4.2.0-fuse-02-00.tar.gz. Los cambios realizados son:

  • El parent es directamente org.apache.felix.karaf:karaf:1.4.0-fuse-02-00.
  • Las coordenadas del proyecto son org.apache.felix.karaf:karaf-smx:1.4.0-fuse-02-00:war.
  • El directorio etc de apache-felix-karaf fue reemplazado por los archivos de la distribución de Fuse, así no hay que agregar a mano el repositorio de Fuse, los features de ServiceMix, bundles, etc.
  • El listener org.apache.felix.karaf.web.WebAppListener fue modificado para:
    • verificar la existencia del link etc en el directorio de trabajo del usuario tomcat6.
    • verificar la existencia del directorio .karaf (y sus permisos) en el home del usuario tomcat6.
    • asignar a storage.location el directorio .karaf del home del usuario tomcat6.

Karaf

Karaf es un contenedor liviano que corre sobre una plataforma OSGIFelix o Equinox- y provee un conjunto de servicios, como logging, hot deploy, configuración dinámica, etc. Karaf actúa como kernel de ServiceMix, por lo que para poder ejecutar ServiceMix en Tomcat (o cualquier otro contenedor) basta lograr ejecutar Karaf en dicho ambiente y luego desplegar los bundles de ServiceMix.

Ubuntu

Ubuntu da problemas para el demo web debido a su esquema de permisos. Cuando uno accede a la shell de Karaf vía SSH, se crea en el home del usuario que corre el proceso Karaf (en este caso tomcat6) el archivo .karaf/karaf.history. Como en Ubuntu el home del usuario tomcat6 es /usr/share/tomcat6, que no tiene permisos de escritura para tomcat6, ocurre una excepción cuando Karaf trata de crear el archivo. Por eso se debe crear a mano /usr/share/tomcat6/.karaf y asignarle permisos de escritura a tomcat6.

Bundle activemq-broker

Otro problema, esta vez relacionado a ServiceMix, es que bundle activemq-broker trata de leer el archivo etc/activemq-broker.xml desde el directorio de trabajo. Esto es “poco amistoso” con un esquema de despliegue web, donde los archivos de la aplicación no se encuentran en el directorio de trabajo. La solución “parche” es crear el link /var/lib/tomcat6/etc a /var/lib/tomcat6/webapps/karaf-smx/WEB-INF/karaf/etc, así el bundle activemq-broker pordrá encontrar etc/ activemq-broker.xml.

Conclusiones

No es complicado desplegar Karaf 1.4, y sobre él ServiceMix 4.2, en Tomcat. Sin embarago, por los detalles expuestos en este post, es notorio que las cosas están hechas para funcionar en forma standalone.

Hace poco (23/07) se liberó Karaf 2.0.0, que define nuevas variables de entorno que permiten distribuir diferentes partes de karaf en el sistema de archivos. Esto permitiría, por ejemplo, dejar la configuración en /etc, los datos en /var, y en el war sólo los binarios.

Otra cosa destacable es que ServiceMix “es sólo” un conjunto de bundles sobre Karaf. Además, hay esfuerzos en Karaf para apoyar la generación de distribuciones personalizadas, lo que es atractivo, pues se podría lograr un runtime “a medida”, con los bunldes justos (y evitar así los 170 y tanto que trae ServiceMix).

  1. Daniel Caro
    August 1st, 2010 at 21:06 | #1

    Suerte en eso !!! armar los bundles para una aplicación es como armar un cubo rubix sin cachar los trucos, aunque igual se nota que están todos migrando a crear sus aplicaciones basandose en OSGi, de hecho la aplicación que estoy haciendo para mi memoria es un mix de Felix, DBCP, Mina y iPOJO, sólo me da una lastima que JSF y varios framework todavía no sea fácil de usar en OSGi, todavía ando buscando alguna forma de hacerle una GUI buena, estoy entre vaadin y wicket, pero realmente es una lata esto de las interfaces web, estoy que la dejo en trabajo futuro xD

    Oye y que tal funciona ServiMix, algún comentario de rendimiento?, yo estuve jugando con Open ESB (Fuji), pero desde que Oracle compro SUN, todos los proyectos se han ido a la misma %$#%! …

    Ya loco suerte con eso … yo ando con ganas de escribir en algún blog todos esos problemas que salen, pero primero a terminar la memoria.

  2. August 2nd, 2010 at 14:12 | #2

    Si, OSGI ya tiene harta penetración en el mundo java, sobre todo en la parte la parte servidores e infraestructura. No conocía vaadin; que te parece spring webflow?… spring tiene buen soporte para OSGI.
    No le he puesto cargas exorbitantes a ServiceMix, pero hay white papers acerca de alta disponibilidad y casos de uso con alta carga. Ah, y ojalá que Oracle no deje morir Glassfish y proyectos relacionados :S

  3. Daniel Caro
    August 3rd, 2010 at 01:00 | #3

    Siempre he escuchado de Spring … creo que entré muy tarde a Java Web, y cuando entré por alguna razones no me agradó mucho spring, pero para el proyecto de la memoria creo que usaré solo la Consola de Felix para ejecutar comandos de administración sólo por que quiero terminar de programar este mes.

    Saludos, y si tienes algún link bueno donde expliquen y vendan bien la pomada de Spring me lo mandas, en una de esas me meto a aprender eso.

  1. No trackbacks yet.