¿Qué es Apache Camel? Lo analizamos en la práctica con código Java
\n\n¿Alguna vez se ha preguntado cómo los grandes sistemas intercambian datos? Uno registra logs en un archivo, otro espera JSON por HTTP, un tercero trabaja con colas RabbitMQ. Conectarlos directamente significa escribir una montaña de código "pegamento": analizadores, adaptadores, manejadores de errores. Aquí es donde entra en escena Apache Camel — un potente framework de integración que se encarga de toda la rutina.
\n\nSi busca una explicación de Apache Camel con ejemplos reales en Java, ha llegado al lugar correcto. Analizaremos cómo funcionan las rutas, para qué sirven los EIP (Patrones de Integración Empresarial) y por qué Camel no es otro ORM, sino una navaja suiza para la integración.
\n\nEl problema que resuelve Apache Camel
\nImagine: tiene tres servicios:
\n- \n
- El Servicio A entrega datos en archivos CSV a través de FTP. \n
- El Servicio B solo acepta XML por HTTP. \n
- El Servicio C trabaja con Kafka. \n
Sin un framework de integración, tendría que escribir un conector separado para cada par. ¿Y si mañana se añade AMQP o MongoDB? El código se inflaría, las pruebas se convertirían en una pesadilla.
\nApache Camel resuelve esto de forma sencilla: usted describe las rutas (routes) en Java o XML, y Camel mismo conecta los componentes necesarios (FTP, HTTP, Kafka, JMS y cientos más). No necesita conocer los detalles del protocolo — Camel lo hace todo "bajo el capó".
\n\nArquitectura básica: rutas y componentes
\nEn el núcleo de Camel está el concepto de ruta (route). Es una cadena de pasos: desde el origen (from) hasta el destino (to). Entre ellos puede haber transformaciones, filtros, enriquecimiento de datos.
\nEjemplo de una ruta muy simple:
\nfrom("file:data/input?noop=true")\n .log("Archivo recibido: ${header.CamelFileName}")\n .to("file:data/output");\n\nAquí leemos archivos de la carpeta data/input (con la opción noop=true para no eliminar los originales) y los copiamos a data/output. Camel mismo monitorea los cambios, bloqueos y errores.
Análisis del código: desde archivo hasta base de datos
\nSupongamos que necesita leer CSV de una carpeta, analizar las líneas y guardarlas en PostgreSQL. Sin Camel, escribiría FileWatcher + OpenCSV + JDBC. Con Camel, son un par de líneas:
\nimport org.apache.camel.builder.RouteBuilder;\n\npublic class CsvToDbRoute extends RouteBuilder {\n @Override\n public void configure() throws Exception {\n from("file:data/csv?delay=5000")\n .unmarshal().csv() // analiza CSV en una lista de listas\n .split(body()) // procesa cada línea\n .process(exchange -> {\n // Convierte la línea en una consulta SQL\n List<String> row = exchange.getIn().getBody(List.class);\n String sql = String.format("INSERT INTO users (name, age) VALUES ('%s', %s)", row.get(0), row.get(1));\n exchange.getIn().setBody(sql);\n })\n .to("jdbc:myDataSource?useHeadersAsParameters=true");\n }\n}\n\n¿Qué sucede aquí?
\n- \n
unmarshal().csv()— analizador CSV incorporado. \n split(body())— divide el conjunto de líneas en mensajes individuales. \n process()— lógica personalizada (conversión a SQL). \n to("jdbc:myDataSource")— ejecuta la consulta a través del componente JDBC. \n
Este es un ejemplo de Apache Camel en acción: mínimo código, máxima funcionalidad.
\n\nPatrones de Integración (EIP) — el arma secreta de Camel
\nUna de las principales características de Camel es la implementación de los Enterprise Integration Patterns (EIP). Son soluciones arquitectónicas probadas: Content-Based Router, Splitter, Aggregator, Wire Tap y otros.
\nEjemplo de un enrutador basado en contenido (Content-Based Router):
\nfrom("direc