Qu'est-ce qu'Apache Camel ? Comprenons en pratique avec du code Java
\n\nAvez-vous déjà réfléchi à la façon dont les grands systèmes échangent des données ? L'un écrit des logs dans un fichier, un autre attend du JSON via HTTP, un troisième travaille avec des files d'attente RabbitMQ. Les relier directement signifie écrire une montagne de code "colle" : analyseurs, adaptateurs, gestionnaires d'erreurs. C'est ici qu'entre en scène Apache Camel — un puissant framework d'intégration qui prend en charge toute la routine.
\n\nSi vous cherchez une explication d'Apache Camel avec des exemples concrets en Java, vous êtes au bon endroit. Nous analyserons comment fonctionnent les routes, pourquoi les EIP (modèles d'intégration d'entreprise) sont nécessaires et pourquoi Camel n'est pas un énième ORM, mais un couteau suisse pour l'intégration.
\n\nLe problème résolu par Apache Camel
\nImaginez : vous avez trois services :
\n- \n
- Le service A fournit des données dans des fichiers CSV via FTP. \n
- Le service B n'accepte que du XML via HTTP.
- Le service C fonctionne avec Kafka.
Sans framework d'intégration, vous devriez écrire un connecteur séparé pour chaque paire. Et si demain s'ajoute AMQP ou MongoDB ? Le code gonflerait, les tests deviendraient un cauchemar.
\nApache Camel résout cela simplement : vous décrivez les routes en Java ou XML, et Camel connecte lui-même les composants nécessaires (FTP, HTTP, Kafka, JMS et des centaines d'autres). Vous n'avez pas besoin de connaître les détails du protocole — Camel fait tout "sous le capot".
\n\nArchitecture de base : routes et composants
\nÀ la base de Camel se trouve le concept de route. C'est une chaîne d'étapes : de la source (from) au destinataire (to). Entre elles, il peut y avoir des transformations, des filtres, un enrichissement des données.
\nExemple de route très simple :
\nfrom("file:data/input?noop=true")\n .log("Fichier reçu : ${header.CamelFileName}")\n .to("file:data/output");\n\nIci, nous lisons les fichiers du dossier data/input (avec l'option noop=true pour ne pas supprimer les sources) et les copions dans data/output. Camel gère lui-même les modifications, les verrous et les erreurs.
Analyse du code : du fichier à la base de données
\nSupposons que vous deviez lire un CSV depuis un dossier, analyser les lignes et les enregistrer dans PostgreSQL. Sans Camel, vous écririez FileWatcher + OpenCSV + JDBC. Avec Camel — quelques lignes :
\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() // analyse le CSV en liste de listes\n .split(body()) // traite chaque ligne\n .process(exchange -> {\n // Transforme la ligne en requête 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\nQue se passe-t-il ici ?
\n- \n
unmarshal().csv()— l'analyseur CSV intégré.split(body())— divise l'ensemble des lignes en messages individuels.process()— logique personnalisée (transformation en SQL).to("jdbc:myDataSource")— exécution de la requête via le composant JDBC.
C'est un exemple d'Apache Camel en action : un minimum de code, un maximum de fonctionnalités.
\n\nLes modèles d'intégration (EIP) — l'arme secrète de Camel
\nL'une des principales caractéristiques de Camel est l'implémentation des Enterprise Integration Patterns (EIP). Ce sont des solutions architecturales éprouvées : Content-Based Router, Splitter, Aggregator, Wire Tap et autres.
\nExemple de routeur basé sur le contenu (Content-Based Router) :
\nfrom("direc