Con este tutorial comenzamos una serie de artículos sobre el ESB (Enterprise Service Bus) Apache ServiceMix y otras tecnologías open source de aplicación en el desarrollo de soluciones SOA. En esta primera entrega, veremos lo fácil que resulta comenzar con Apache ServiceMix 3 y plantearemos un sencillo ejemplo basado en un típico caso de uso en proyectos de integración de sistemas.
En la actualidad existe en el mercado una amplia oferta de productos ESB tanto comerciales como de código abierto. Si bien en todos los casos la finalidad de estos productos es básicamente la misma, existen ciertas diferencias sustanciales entre ellos. Los ESB comerciales suelen disponer de ciertas herramientas tipo GUI que facilitan la administración de los distintos componentes, además de contar con soporte técnico y documentación de referencia. Los de código abierto suelen carecer de interfaces ricas de administración y en general la documentación deja mucho que desear, pero por el contrario ofrecen un rango mayor de posibilidades de integración y un alto nivel de extensibilidad gracias a estar basados la mayoría de las veces en estándares.
En esta serie de tutoriales nos centraremos en Apache ServiceMix 3 como producto ESB de código abierto y exploraremos sus posibilidades para solucionar problemas de negocio que impliquen integración de servicios y sistemas. Apache ServiceMix 3 se caracteriza por implementar el estándar JBI (JSR-208) consiguiendo así un bajo acoplamiento entre los distintos componentes de la solución y garantizando su adecuación a otros ESB que cumplan igualmente con el estándar. Actualmente, se está desarrollando Apache ServiceMix 4 que supondrá un cambio profundo en la arquitectura del ESB alineándose en este caso con el estándar OSGi. No obstante, los componentes JBI desarrollados para la versión 3 seguirán funcionando perfectamente en la versión 4.
Caso de uso
La solución que implementaremos con la ayuda de Apache ServiceMix será una versión muy escalable del típico file poller. Un servicio JBI, en este caso desplegado sobre un binding component de tipo file, monitorizará un directorio y enviará el contenido de los ficheros que se vayan almacenando en ella a otro servicio, en este caso desplegado sobre un service engine de tipo bean, para ser finalmente traceados con la ayuda de Log4j. Ambos servicios funcionarán coordinadamente para ofrecer una solución completa de integración permaneciendo agnósticos uno respecto del otro en cuanto a sus detalles de implementación. Se podrá descargar la solución completa pulsando el link situado al final del artículo.

Preparación del entorno
Como muestra el diagrama de flujo, deberemos crear dos endpoints desplegados sobre los componentes servicemix-file y servicemix-bean que implementen los servicios a los que están destinados. ServiceMix permite desplegar más de un endpoint por servicio, relación similar a la existente entre puertos e IPs en el caso de direcciones de red, pero con el objetivo de no complicar el tutorial más de lo necesario, mantendremos la relación más básica, es decir, un solo endpoint por servicio.
ServiceMix permite dos modos de despliegue distintos dependiendo de la configuración elegida para los endpoints de la solución de integración. El modo habitual es desplegar ensamblados de service units (cada uno de estos es un conjunto de endpoints que vivirán sobre el mismo componente JBI, configurados en un fichero llamado xbean.xml) sobre una instancia previamente levantada de ServiceMix. A cada uno de estos ensamblados se le conoce como service assembly. No obstante, para nuestro tutorial vemos más práctico el usar el modo embebido, ya que facilita enormemente las tareas sobre todo en el ambito de desarrollo. Esto es debido a que se usa un único fichero de configuración (servicemix.xml) para configurar tanto el contenedor JBI como los endpoints que se desplegarán sobre él. Este tipo de despliegue nos permite centrarnos en la creación de los endpoints, además de ahorrarnos el tener que descargar la distribución completa de ServiceMix.
Existen dos herramientas que nos facilitarán increíblemente estas tareas de despliegue: Apache Maven y Apache Ant. En este tutorial utilizaremos la primera, por tanto, recomendamos descargar Maven (en formato comprimido), extraerlo y añadir la ruta de su carpeta bin a la variable de entorno PATH del sistema operativo.
Para aprovecharnos de las ventajas de Maven, deberemos adaptarnos a su jerarquía de directorios y ficheros, por lo que crearemos una estructura con el siguiente aspecto:

Creación del primer endpoint
Para crear nuestro file poller deberemos declararlo en nuestro fichero servicemix.xml como se muestra a continuación. Aparte de especificar el nombre del endpoint y del servicio, bastará con especificar la ruta del directorio a monitorizar y el servicio al que enviar el contenido. ServiceMix se encargará del resto.
<file:poller service="foo:poller"
endpoint="poller"
targetService="foo:logger"
file="inbox" />
Creación del segundo endpoint
Nuestro segundo servicio será una clase Java en la que realizaremos la lógica de tratamiento de los mensajes recibidos, en nuestro caso, añadirlos al log. Su configuración en el fichero servicemix.xml también será extremadamente sencilla: con indicar su clase, ServiceMix se encargará de enrutar los mensajes que el servicio deba tratar. Obviamente tendremos que darle nombre a nuestros servicio y endpoint creados.
<bean:endpoint service="foo:logger"
endpoint="logger">
<bean:bean>
<bean class="smx15mins.LogService" />
</bean:bean>
</bean:endpoint>
Su implementación también será simple: basta con tener un método con un annotation especificando que se trata de una operación del servicio (@Operation), que espere como único parámetro de entrada un MessageExchange (estándar de los intercambios de mensajes dentro del ESB). Lo demás que haya en el servicio será nuestra lógica de tratamiento del mensaje recibido.
@Operation
public void log(MessageExchange message) {
log.info("Recibido intercambio: " + message);
}
Es importante darse cuenta de que esta operación podrá ser invocada desde cualquier otro servicio de nuestra aplicación, por lo que será altamente reutilizable.
Configuración del ESB
Como se comentó la sección de Preparación del entorno, la configuración del contenedor JBI de ServiceMix y de los endpoints de la solución se centraliza en un único fichero de nombre servicemix.xml. A continuación se muestra el aspecto final que debería tener este fichero, configurando de forma básica el contenedor y a falta de insertar en él los endpoints que hemos creado.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xbean.org/schemas/spring/1.0"
xmlns:sm="http://servicemix.apache.org/config/1.0"
xmlns:jencks="http://jencks.org/2.0"
xmlns:file="http://servicemix.apache.org/file/1.0"
xmlns:bean="http://servicemix.apache.org/bean/1.0"
xmlns:foo="http://foo.bar/smx15mins/">
<!-- Transaction Manager -->
<jencks:transactionManager id="transactionManager" />
<sm:container id="jbi"
rootDir="SMXData"
useMBeanServer="true"
createMBeanServer="true"
transactionManager="#transactionManager"
flowName="seda"
autoEnlistInTransaction="true">
<sm:activationSpecs>
<sm:activationSpec componentName="fileComponent">
<sm:component>
<file:component>
<file:endpoints>
<file:poller service="foo:poller"
endpoint="poller"
targetService="foo:logger"
file="inbox" />
</file:endpoints>
</file:component>
</sm:component>
</sm:activationSpec>
<sm:activationSpec componentName="beanComponent">
<sm:component>
<bean:component>
<bean:endpoints>
<bean:endpoint service="foo:logger"
endpoint="logger">
<bean:bean>
<bean class="smx15mins.LogService" />
</bean:bean>
</bean:endpoint>
</bean:endpoints>
</bean:component>
</sm:component>
</sm:activationSpec>
</sm:activationSpecs>
</sm:container>
</beans>
Despliegue de la solución
Para desplegar la solución entera, gracias al plug-in JBI de Maven, valdrá con ejecutar el siguiente comando desde el directorio raíz del proyecto. Aquí deberá estar situado el descriptor del proyecto, el pom.xml. Recomendamos descargarlo junto con el resto de codigo de la solución en el link del final del tutorial.
mvn jbi:embeddedServicemix
Una vez ejecutado, Maven descargará automáticamente todas las librerías necesarias para arrancar nuestra solución (aquí se incluyen tanto las librerías de ServiceMix como las que necesite nuestra solución particular), por lo que en caso de ser la primera vez que ejecutamos esta instrucción puede que haya que esperar algunos minutos (esto no pasará posteriores ejecuciones ya que se almacenarán las librerías en nuestro disco duro). Por tanto, deberíamos aprovechar ahora para prepararnos un buen café, ya que una vez terminada la descarga podremos saborearlo disfrutando del funcionamiento de nuestra solución en ServiceMix añadiendo cualquier fichero a la carpeta “inbox” creada en el directorio actual. Veremos como el fichero desaparece de la carpeta y su contenido se loguea como era esperado. (Nota: sólo se mostrará el contenido del fichero correctamente si está en XML, pero desde el método de nuestro servicio se podrá tratar de todos modos).
Próximos pasos
Dependiendo de nuestras exigencias de negocio, podremos añadir nuevas funcionalidades a nuestra aplicación de muchas formas distintas:
- Añadir más lógica de tratamiento del mensaje a nuestro servicio de Log (por ejemplo, guardar el mensaje en base de datos).
- Crear nuevos servicios usando clases Java que realicen operaciones más complejas (por ejemplo, extraer información de los mensajes recibidos).
- Explorar otros componentes de ServiceMix (por ejemplo, crear un endpoint en servicemix-saxon que realice una transformación XSL antes de loguear el mensaje).
Código fuente de la solución
Para descargar el código mostrado en este tutorial, haga clic aquí.


mayo 11, 2011 - 01:20
Buen aporte, me sirvio bastante.
Tengo una pregunta, por lo que he leido Apache Service Mix no ocupa UDDI, entonces que ocupa para descubrir los servicios que tiene??? y en donde esta fisicamente, ya que debe ser un xml.
Muchas Gracias.
Saludos.