En el post anterior nos introducimos en los conceptos básicos y fundamentos de Apache Camel, dando luz a este interesante framework de Integración de software. 

Ahora es momento de profundizar en el funcionamiento de esta tecnología.

Camel posee una arquitectura orientada a mensajes por lo que podríamos empezar indagando:

¿Qué es un mensaje y cómo funciona? 

Apache Camel especifica una interfaz llamada Exchange. Esta interfaz propone encapsular el mensaje extendiendo su funcionalidad con el fin de admitir varios patrones de intercambio de mensajes. Se podría ver al Exchange como el sobre de un mensaje en donde se contiene la información relevante para identificar, reenviar y procesar un mensaje.    

Exchange ID: Es un identificador único del Exchange 

MEP: En esta propiedad se puede configurar el tipo de intercambio de mensajes. Esto indica si un intercambio de mensajes es un mensaje de evento unidireccional o un intercambio de mensajes de solicitud de respuesta  

Exception: aquí se encapsulan las excepciones resultantes de la transformación de un mensaje. Por ejemplo: si envío un mensaje a un componente y este por alguna razón lanza una excepción esa excepción será capturada y enviada como pararte de mensaje de salida por el componente. 

Properties: en esta propiedad se pueden almacenar datos que no son parte del mensaje, pero sirven para brindar información de como procesarlo. 

Header: en esta propiedad se envía/recibe meta data relacionada a las transformaciones del mensaje. 

Attachments: en esta propiedad se pueden adjuntar archivos para ser enviado como parte del mensaje. 

Body: aquí es donde se almacena el mensaje propiamente dicho. Ósea los datas que se desean enviar.    

¿Entonces que es un mensaje? 

Un mensaje es una clase Java que implementa la interfaz Message por lo que está compuesta por un HeaderAttachments y un Body.  

Processors:

Otros actores importantes en el flujo del funcionamiento de una ruta Camel son los Processors. 

Un processor es un bloque de código que se encarga de manipular un mensaje ya sea para transformar, enriquecer, extraer, etc.(Patrones de integración Empresarial) o para aplicar lógica de integración. 

Camel especifica una interfaz llamada Processor con un método process que recibe como parámetro un Objeto que implementa Exchange. Este método es ejecutado cuando se invoca al processor desde una ruta, por lo que en este método va el código que se encarga de manipular el mensaje.   

¿Mucha teoría?, bueno veamos un ejemplo sencillo para dejar un poco más en claro como un mensaje es transformado en un Processor. 

Supongamos que se desea usar un processor para Modificar un mensajeEsto puede hacerse de la siguiente manera: 

public class LoginMessageProcesor implements Processor { 

     @Override 
     public void process(Exchange exchange) throws Exception {     
         String body = exchange.getMessage().getBody(String.class);          
         exchange.getMessage().setBody("Hello " + body); 

} 

Y la ruta lo utiliza así:

public class MyRouteBuilder extends RouteBuilder { 

    public void configure() { 

        from("timer:simple?period=1000") 
        .process(new LoginMessageProcesor()) 
        .log() 
        .end(); 
    }
 
} 

Parece ser algo muy simple sin embargo, hay un gran problema: el método setBody() reemplazara la información en el body del Mensaje , lo que significa que no se propagará ninguna otra información del body que originalmente había; lo que significa que se perderá esos datos. 

Este comportamiento es común para todo el mensaje por lo que es necesario copiar los datos que se desean mantener luego del procesamiento del mensaje.  

public void process(Exchange exchange) throws Exception {        
    
     String body = exchange.getIn().getBody(String.class);        

     exchange.getMessage().setBody("Hello " + body);            

     exchange.getMessage()
             .setHeaders(exchange.getMessage() 
             .getHeaders(); 

     exchange.getMessage()
             .setAttachments(exchange.getMessage() 
             .getAttachments(); 

} 

Ahora nos aseguramos de que todos los datos adicionales se propaguen en el nuevo mensaje. 

Componentes: 

Un componente es una clase java que implementa la interface Component, el objetivo de los componentes es  permitir conectar nuestras rutas a diferentes API, protocolos, formatos de datos, etc.  

Cada componente expone un endpoint por donde podremos enviar nuestros mensajes dentro de una ruta camel y recibir otro mensaje como resultado de la operación de ese componente. 

Podríamos crear nuestros propios componentes de forma muy sencilla implementando la interface Component pero Camel nos evita tener que crear estas integraciones ya que la mayoría ya están resueltas. Si existe alguna necesidad de integración seguro ya existe un componente que la soluciona. Por lo tanto, este asombroso framework de integración logra su objetivo principal que es facilitar la integración. 

Camel viene con un set de componentes básicos pero estos pueden ser extendidos. 

En la página oficial están disponibles más de 100 componentes listos para ser descargados y ser usados. 

Bien eso es todo por ahora, espero que les haya servido para entender un poco más de este interesante framework de integración.  

¡Hasta el próximo Post! 

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!