Apache Camel

  • View
    1.197

  • Download
    0

Embed Size (px)

Text of Apache Camel

  • 1. Abimael Desales Lpez Java Developers Mexico www.facebook.com/JavaDevelopersMexico

2. Endpoints Un endpoint es una abstraccin que modela el extremo de un canal de mensaje a travs del cual un sistema puede enviar o recibir mensajes. En primer lugar vamos a ver cmo se pueden usar las URIs para configurar Camel para comunicar sobre FTP y JMS, los cuales son dos de los protocolos de transporte ms usados. 3. Trabajando con archivos sobre FTP Una de las cosas que hace a Camel fcil de comprender es la URI del endpoint. Especificando una URI, puedes identificar el componente que quieres usar y cmo ese componente est configurado. Puedes decidir entonces ya sea enviar mensajes al componente configurado por esta URI, o consumir mensajes de l. Para comprender de una manera ms clara, se ilustrarn los conceptos a travs de un ejemplo: Auto Partes Rider, un negocio de partes de motocicletas ficticio, que provee partes a fabricantes de motocicletas. 4. Al paso de los aos, han cambiado la forma en que reciben rdenes varias veces. Inicialmente colocaban rdenes cargando archivos de valores separados por comas (CSV) a un servidor FTP. El formato de mensaje fue cambiado a la postre a XML. Actualmente proporcionan un sitio web a travs del cual las rdenes son emitidas como mensajes XML sobre HTTP. Auto Partes Rider solicita a los nuevos clientes usar la interfaz web para colocar las rdenes, pero debido a los SLAs con los clientes existentes, deben mantener todos los formatos e interfaces de mensajes viejos en funcionamiento. 5. Todos estos mensajes son convertidos a un formato POJO antes de ser procesado. En la siguiente figura se muestra una lista de alto nivel del sistema de procesamiento de rdenes. Fig. 1. Un cliente tiene dos formas de emitir rdenes al sistema de manejo de rdenes Auto Partes Rider: ya sea cargando el archivo de rdenes plano a un servidor FTP o emitiendo una orden a travs de la tienda web de Auto Partes Rider. Eventualmente todas las rdenes son enviadas va JMS para procesarlas en Auto Partes Rider. 6. Como una primera asignacin, necesitars implementar el mdulo FTP en el sistema frontend de rdenes de Rider. Implementar el mdulo FTP involucrar los siguientes pasos: 1. Votear en el FTP server y descargar nuevas rdenes 2. Convertir los archivos de rdenes a mensajes JMS 3. Enviar el mensaje a la queue JMS incomingOrdenes 7. Para descargar nuevas rdenes del servidor FTP, necesitas hacer lo siguiente: 1. Conectar al servidor FTP rider.com en el puerto FTP default de 21 2. Proporcionar un username de rider y password de secret 3. Cambiar el directorio a ordenes 4. Descargar cualesquiera archivos de rdenes nuevas 8. Camel buscar primero el esquema ftp en el registro de componentes, el cual resolver al FTPComponent. El FTPComponent entonces funciona como una factory, creando el FTPEndpoint basado en la ruta del contexto y las opciones. La ruta del contexto de rider.com/ordenes le dice al FTPComponent que debe loguearse en el servidor FTP en rider.com en el puerto FTP default y cambiar el directorio a ordenes. Finalmente, las nicas opciones especificadas son username y password, las cuales son usadas para loguearse en el servidor FTP. 9. El FTPComponent no es parte del mdulo camel-core, as que tienes que agregar una dependencia adicional a tu proyecto. Usando Maven slo tienes que agregar la siguiente dependencia a tu POM: org.apache.camelcamel-ftp2.5.0 La URI de este endpoint se estar usando para descargar rdenes del servidor FTP. Para hacerlo as, necesitas usarlo en un nodo from del DSL de Camel: from(ftp://rider.com/ordenes?username=rider&password=secret) 10. Lo anterior es todo lo que necesitas hacer para consumir archivos desde un servidor FTP. ftp://rider.com/ordenes?username=rider&password=secret Esquema Ruta del contexto Opciones Figura 2. La URI de un endpoint Camel consiste de tres partes: un esquema, una ruta de contexto, y una lista de opciones. 11. Enviando a una Queue JMS Camel proporciona soporte extensivo para conectar proveedores habilitados para JMS. Por ahora slo cubriremos lo suficiente para que puedas completar tu primer tarea para Auto Partes Rider. Recordemos que necesitas descargar rdenes de un servidor FTP y enviarlas a una queue JMS. JMS Java Message Service es una API Java que te permite crear, recibir, y leer mensajes. Adems obliga que la mensajera sea asncrona y tenga elementos especficos de confiabilidad, como entrega garantizada y una-y-solamente-una-vez. JMS es la solucin de facto en la comunidad Java. 12. En JMS, los consumidores y productores de mensajes se hablan uno a otro a travs de un intermediario un destino JMS. Como se muestra en la figura 3, un destino puede ser una queue o un topic. Las Queues son estrictamente punto-a-punto, donde cada mensaje tiene slo un consumidor. Los Topics operan en un esquema publish/subscribe; un slo mensaje puede ser entregado a muchos consumidores si ellos se han suscrito al topic. JMS tambin proporciona una ConnectionFactory la cual los clientes (como Camel) pueden usar para crear una conexin con un proveedor JMS. A los proveedores JMS generalmente se les refiere como brokers debido a que ellos gestionan la comunicacin entre el productor del mensaje y el consumidor del mensaje. 13. Cmo usar camel para usar un Proveedor JMS Para conectar camel a un proveedor JMS especfico, necesitas configurar el componente JMS de Camel con una ConnectionFactory apropiada. Apache ActiveMQ es uno de los proveedores JMS open source ms populares; y es el broker JMS que el equipo de Camel usa para probar el componente JMS. Por lo cual estaremos usndolo para demostrar los conceptos JMS en el artculo. Figura 3. Hay dos tipos de destinos JMS: queues y topics. La queue es un canal punto a punto, donde cada mensaje tiene un slo receptor. Un topic entrega una copia del mensaje a todos los clientes quienes se hayan suscrito para recibirlo. 14. As que en el caso de Apache ActiveMQ, puedes crear una ActiveMQConnectionFactory que apunta a la ubicacin del broker ActiveMQ que est corriendo. ConnectionFactory cf = new ActiveMQConnectionFactory(vm://localhost); La URI vm:/localhost significa que debes conectarte a un broker embebido llamado localhost corriendo dentro de la JVM actual. El conector de transporte vm en ActiveMQ crea un broker bajo demanda si uno no est corriendo an. de forma que es muy prctico para aplicaciones JMS de pruebas; para escenarios de produccin, se recomienda que conectes un broker que ya est en ejecucin. Adems, en escenarios de produccin se recomienda que se use un pool de conexiones cuando se conecta a un broker JMS. 15. A continuacin, cuando creas tu CamelContext puedes agregar el componente JMS como sigue: CamelContext context = new DefaultCamelContext(); context.addComponent(jms, JmsComponent.jmsComponentAutoAcknowldge(connectionFactory)); El componente JMS y la connection factory especfica de ActiveMQ no son parte del mdulo core de Camel. Con fines de usar este, necesitars agregar algunas dependencias a tu proyecto basado en Maven. Para el componente JMS plano, todo lo que tienes que hacer es esto: org.apache.camelcamel-jms5.3.2 16. La connection factory viene directamente de ActiveMQ, de forma que tendrs que agregar la siguiente dependencia: org.apache.activemqactivemq-core5.3.2 Ahora que has configurado el componente JMS para conectar a un broker JMS real, es hora de ver cmo las URIs pueden ser usadas para especificar el destino. 17. Usando URIs para especificar el Destino Una vez configurado el componente JMS, puedes enviar y recibir mensajes JMS a tu gusto. Debido a que ests usando URIs es muy fcil de configurar. Digamos que quieres enviar un mensaje JMS a la queue llamada incomingOrders. La URI en este caso sera: jms:queue:incomingOrders Esto es muy autoexplicatorio. El prefijo jms indica que ests usando el componente JMS que configuraste antes. Especificando queue, el componente JMS sabe que enviar a una queue llamada incomingOrders. An pudiste haber omitido el calificador queue, debido a que el comportamiento default es enviar a una queue ms que a un topic. 18. Usando el DSL Java de Camel puedes enviar un mensaje a la queue incomingOrders usando la palabra clave to, como en este caso: to(jms:queue:incomingOrders) Lo cual puede ser ledo como enviando a la queue JMS llamada incomingOrders. 19. Creando routes en Java Antes de adentrarnos en los enrutamientos es necesario conocer unos conceptos bsicos de los mismos. CamelContext La figura 1.7 muestra los servicios ms notables que mantiene unidos el CamelContext. Estos servicios son descritos en la tabla 1. Figura 1.7 El CamelContext provee acceso a muchos servicios tiles, los ms notables siendo componentes, convertidores de tipo, un registro, endpoints, routes, formatos de datos, y lemguajes. 20. Servicio Descripcin Componentes Contiene los componentes usados. Camel es capaz de cargar componentes en el aire, ya sea autodescubriendo en el claspath o cuando un nuevo bundle es activado en un contenedor OSGi. Endpoints Contiene los endpoints que han sido creados Routes Contiene los routes que han sido agregados. Convertidores de tipo Contiene los convertidores de tipo cargados. Camel tiene un mecanismo que te permite convertir manual o automticamente de un tipo a otro. Formatos de datos Contiene los formatos de datos cargados Registro Contiene un registro que te permite localizar beans. Por default, este ser un registro JNDI. Si ests usando Camel desde Spring, ser el ApplicationContext. Puede ser un registro OSGi si usas Camel en un contenedor OSGi. Lenguajes Contiene los lenguajes cargados. Camel te permite usar diferentes lenguajes para crear exprsiones. 21. Motor de Enrutamiento El motor de enrutamiento de Camel es lo que realmente mueve los mensajes tras bambalinas. Este motor no es expuesto al desarrollador, pero debe estar consciente de que est ah y hace el trabajo pesado, asegurando que los m