viernes, 5 de diciembre de 2014

Implementando Patrones de Integración Empresarial con Apache Camel

  1. ¿Qué es Enterprise Integration Patterns?

Es un libro de Gregor Hohpe y Booby Wolf en el que se describen 65 patrones de diseño para el uso de un aplicación de integración empresarial y una middleware orientada a mensajes en forma de patrones.




  1. ¿Cómo implementar estos patrones?

Actualmente estos patrones son implementados mediante muchos códigos libre ESB´s. Por ejemplo:

·    Spring Integration
·    Apache Camenl
·    Mule ESB
·    Guaraná DSL

A continuación impartiremos algunos consejos para poder implementar 1 patrón de integración utilizando en este caso Apache Camel.

  1. Implementando los patrones Splitter y Aggregator con Apache Camel:

A.- Patrón Splitter

Recordemos que el patrón Splitter nos permite dividir un mensaje en pedazos y procesarlas individualmente.  Es necesario especificar un Splitter como split(). En versiones antiguas de Camel, se usará splitter().



Ejemplo:

Los siguientes Ejemplos muestran como tomar un request del queue:a endpoint dividirlo usando una Expresión, y luego avanzar hacia cada pedazo queue:b.

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
        errorHandler(deadLetterChannel("mock:error"));

        from("direct:a")
            .split(body(String.class).tokenize("\n"))
                .to("direct:b");
    }
};
Podemos usar cualquier lenguaje soportado como: XPath, XQuery, etc.

from("activemq:my.queue").split(xpath("//foo/bar")).convertBodyTo(String.class).to("file://some/directory")
Usando Extensiones Spring XML
<camelContext errorHandlerRef="errorHandler" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:a"/>
        <split>
            <xpath>/invoice/lineItems</xpath>
            <to uri="direct:b"/>
        </split>
    </route>
</camelContext>

Dividiendo un Conjunto, Iteración o Arreglo

Un caso común es dividir un conjunto, iteración o arreglo de mensajes. En el ejemplo siguiente usaremos una Expresión para identificar el valor del split.

from("direct:splitUsingBody").split(body()).to("mock:result");

from("direct:splitUsingHeader").split(header("foo")).to("mock:result"); 
En Spring XML puedes usar el lenguaje Simple para identificar el valor de un split.

<split>
   <simple>${body}</simple>
   <to uri="mock:result"/>
</split>

<split>
   <simple>${header.foo}</simple>
   <to uri="mock:result"/>
</split>  

Usando Extensiones Spring XML  


Podemos usar expresiones en el DSL Spring para divider los cuerpos o cabeceras y tomarlos con un identificador. A continuación un tag identificador utilizado comúnmente.

    <route>
        <from uri="direct:start"/>
        <split>
            <tokenize token="@"/>
            <to uri="mock:result"/>
        </split>
    </route>
</camelContext>

¿Qué devuelve el Camel?
·         Camel 2.2 or older: El Splitter retornará por defecto el último mensaje dividido.
·         Camel 2.3 and newer: El Splitter por defecto devolverá el mensaje original.
·         Todas las versiones: Podemos sobreescribir esto, reemplazando nuestra propia estrategia con AggregationStrategy.

Ejecución paralela de diferentes partes

Si deseas ejecutar todas las partes en paralelo puedes usar una notación especial de split() con 2 argumentos, donde el segundo es un flag boolean.
XPathBuilder xPathBuilder = new XPathBuilder("//foo/bar");
from("activemq:my.queue").split(xPathBuilder, true).to("activemq:my.parts");

Referencias:





No hay comentarios:

Publicar un comentario