Continuamos nuestra serie de tutoriales sobre el ESB Apache ServiceMix presentando un nuevo enfoque de implementación de EIPs distinta a la planteada en Enterprise Integration Patterns en ServiceMix. En este caso, exploraremos la integración del ESB Apache ServiceMix con Apache Camel presentando un sencillo caso de uso, típico de proyectos de integración de sistemas.
¿Qué es Apache Camel?
Apache Camel es un potente framework open source de integración de sistemas, diseñado para implementar los Enterprise Integration Patterns (EIPs), descritos en el libro Enterprise Integration Patterns de Gregor Hohpe y Booby Woolf. En un artículo anterior ya hicimos una introducción al uso de estos EIPs dentro de ServiceMix, utilizando para ello el service engine servicemix-eip. Apache Camel supone una evolución respecto de dicho componente que, entre otras, aporta las siguientes ventajas:
- Puede funcionar en modo standalone, es decir, no depende de ser desplegado sobre un contenedor (por ejemplo Apache ServiceMix).
- Implementa más patrones de integración empresariales que servicemix-eip.
- Permite implementar estos patrones utilizando tres lenguajes distintos: XML, un DSL basado en Java y el interesante Scala.
En el Tutorial: DSLs en Apache Camel se discuten más ampliamente los lenguajes de dominio específico (DSLs) particularmente en Apache Camel.
Apache Camel en ServiceMix

Pese a que servicemix-eip fue una buena primera aproximación a la implementación de EIPs en ServiceMix, solamente consigue una solución parcial debido a su limitado número de patrones a implementar. El componente servicemix-camel, en cambio, cuenta con la posibilidad de introducir en el flujo de mensajes de nuestra solución casi cualquier patrón del libro de Hohpe y Woolf. Además, las próximas versiones de ServiceMix están apostando por el uso de Apache Camel como solución coreográfica, por lo que parece buena idea ponerse manos a la obra en conocer su funcionamiento.
Caso de Uso
Este artículo se centrará en crear las rutas que seguirán los mensajes que sean enviados a través del NMR del ESB Apache ServiceMix. Resolverá de forma sencilla el mismo caso de uso del artículo Enterprise Integration Patterns en Apache ServiceMix, esta vez utilizando el componente servicemix-camel en lugar de servicemix-eip. Posteriormente se propondrán posibles extensiones al escenario planteado con el objetivo final de crear una solución SOA con el workflow concentrado en un único punto: nuestro RouteBuilder de Camel.

Creación de las rutas de Camel
Deberemos desplegar nuestra lógica de patrones de integración sobre un contexto de Camel. Hay varias formas de hacer esto, debido a los tres lenguajes que nos ofrece el framework. Dado que es lo menos verboso, crearemos nuestros EIPs utilizando el DSL de Camel basado en Java, por tanto tendremos que definir en nuestro servicemix.xml los paquetes de clases java que contendrán a los creadores de las rutas de mensajes, los RouteBuilders. Esto se consigue con el siguiente snippet:
<camelContext id="camelContext" xmlns="http://activemq.apache.org/camel/schema/spring">
<package>com.tecsisa.art.camel.smx</package>
</camelContext>
Lo siguiente será crear nuestras rutas. Deberemos extender la clase RouteBuilder de Camel e implementar el método configure() con nuestro flujo de mensajes. Dado que queremos realizar un broadcast de nuestro mensaje de entrada a varios servicios, deberemos usar el patrón multicast. Camel nos permite implementar este patrón en una única línea de código, tal y como se ve a continuación:
from("jbi:service:http://foo.bar/CamelInSmx//router")
.multicast().to("jbi:service:http://foo.bar/CamelInSmx//logger",
"jbi:service:http://foo.bar/CamelInSmx//sender");
Configuración del ESB
El service engine servicemix-camel fue creado con el objetivo de ser desplegado sobre una instancia de ServiceMix en modo estándar (JBI). Los escasos ejemplos y documentación enfocados al uso sobre una instancia embebida nos presentaron dificultades a la hora de desarrollar la solución. Tras estudiar a fondo el funcionamiento del framework encontramos un workaround para conseguir desplegar nuestras rutas sin necesitar ServiceMix funcionando en modo estándar (presentado en esta discusión a los desarrolladores de ServiceMix). La solución propuesta fue publicada en la página principal del componente servicemix-camel en beneficio de los usuarios que quisiesen aprovecharse de las ventajas del modo embebido durante la fase de desarrollo. Utilizando nuestro workaround, el fichero servicemix.xml debería quedar como sigue:
<?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/CamelInSmx/">
<sm:container id="jbiContainer" embedded="true">
<sm:activationSpecs>
<sm:activationSpec componentName="fileComponent">
<sm:component>
<file:component>
<file:endpoints>
<file:poller service="foo:poller"
endpoint="poller"
targetService="foo:router"
file="inbox" />
<file:sender service="foo:sender"
endpoint="sender"
directory="outbox" />
</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:activationSpec componentName="camelComponent">
<sm:component>
<ref bean="jbi" />
</sm:component>
</sm:activationSpec>
</sm:activationSpecs>
</sm:container>
<!-- Se debe declarar el componente de camel con el nombre "jbi" -->
<bean id="jbi" useJmx="true" class="org.apache.servicemix.camel.CamelJbiComponent" />
<!-- El contexto de Camel. En este caso indicamos el paquete java que
contiene los distintos routers de Camel. -->
<camelContext id="camelContext" xmlns="http://activemq.apache.org/camel/schema/spring">
<package>com.tecsisa.art.camel.smx</package>
</camelContext>
</beans>
Beneficios
Como hemos dicho anteriormente, Camel es una evolución de servicemix-eip. Por tanto, provee a la solución de los mismos beneficios comentados en el artículo anterior, con algunos añadidos. Entre ellos está la ventaja de proporcionar al desarrollador la opción de crear los Enterprise Integration Patterns utilizando un API de Java, dándole la posibilidad de olvidarse de la verbosidad de las rutas en XML, aún permitiéndolas en caso de ser necesario. Como alternativa a Camel a la hora de centralizar el flujo de información dentro de nuestra solución SOA en ServiceMix existe la opción de utilizar el motor de orquestación Apache Ode (basado en el estándar WS-BPEL). Éste está más centrado en la orquestación de procesos de negocio y es fácilmente integrable con ServiceMix 3 debido a la existencia de una distribución JBI estándar. Ode tiene sus ventajas a la hora de tratar con procesos de negocio bien definidos y complejos que requieran mantener un estado de ejecución del proceso, pero la pendiente de su curva de aprendizaje es bastante mayor que la de Apache Camel.
Próximos pasos
Se recomienda repetir los pasos propuestos en el tutorial "Enterprise Integration Patterns (EIP) en Apache ServiceMix", esta vez utilizando servicemix-camel. Para ello se dispone de una documentación bastante extensa con la sintaxis de casi todos los patrones a usar en la sección de EIPs de Apache Camel.
Código fuente
Para descargar el código fuente mostrado en este tutorial, haga clic aquí.


agosto 3, 2010 - 10:49
Muy buen tutorial! Gracias!