Introduction au framework Camel – Partie 1
La problématique d’intégration de systèmes
Dans un système d’information, nous avons généralement une multitude de systèmes hétérogènes qui ne se comprennent pas nativement (technologies différentes, protocoles de communication différents, etc.) Il est néanmoins indispensable de relier ces systèmes car des applications qui ne communiquent pas ne présentent qu’un intérêt métier limité.
Cela soulève beaucoup de problématiques telles que le format de données, le routage, le monitoring, etc.
Par exemple, comment fait-on pour connecter deux applications, où l’une manipule un fichier CSV alors que la seconde ne comprend que le XML sur JMS ?
Les Entreprise Integration Pattern
Apache Camel est un framework d’intégration, implémentant les EIP (Entreprise Integration Pattern) définis par Gregor Hohpe & Bobby Woolf. Les EIP sont des patterns d’intégration qui nous permettent de résoudre ces problématiques d’intégration avec des solutions éprouvées.
Le framework Camel en supporte environ une cinquantaine.
Les Endpoints
Les endpoints représentent des systèmes, des ressources physiques, des ressources virtuelles, etc. Nous avons par exemple des endpoints HTTP, JMS, FTP pour s’interfacer avec différents protocoles, mais aussi des endpoints Direct, Seda pour communiquer dans une même contexte Camel (nous y reviendrons).
Les endpoints peuvent être de 2 types :
- consumer
- provider
Exemples
Répertoire des factures du mois de mars 2010: file://factures/032010
File de messages de transit des factures: jms://zenika/factures
Les Routes
Une route (chemin entre 2 endpoints) peut être très simple, mais aussi très complexe (transformation de données, diffusion à plusieurs destinataires, filtrage de messages, etc).
Elles permettent d’acheminer le message d’origine jusqu’à leur destination finale.
Camel est capable de configurer des routes via 2 méthodes :
- configuration XML XBean
- utilisation du DSL (Domain Specific Language)
Par exemple, voici la lecture d’un fichier à partir d’un répertoire, puis l’écriture de ce même fichier dans un autre répertoire (nous définissons ici une route très simple) :
Méthode XML
-
<beans xmlns=“http://www.springframework.org/schema/beans”
-
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
-
xsi:schemaLocation=“http://www.springframework.org/schema/bean
-
<camelContext xmlns=“http://camel.apache.org/schema/spring”>
-
<route>
-
<from uri=“file://C://factures//in” />
-
<to uri=“file://C://factures//out” />
-
</route>
-
</camelContext>
-
</beans>
Méthode DSL
1. Déclaration des packages Java à scanner (fichier camel-context.xml)
-
<beans xmlns=“http://www.springframework.org/schema/beans”
-
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
-
xsi:schemaLocation=“http://www.springframework.org/schema/beans
-
<camelContext xmlns=“http://camel.apache.org/schema/spring”>
-
<packageScan>
-
<package>com.zenika.camel.routes</package>
-
</packageScan>
-
</camelContext>
-
</beans>
2. Écriture des routes
-
package com.zenika.camel.routes;
-
import org.apache.camel.builder.RouteBuilder;
-
public class FacturesRoute extends RouteBuilder {
-
@Override
-
public void configure() throws Exception {
-
from(“file://C://factures//in”).to(“file://C://factures//out”);
-
}
-
}
La méthode DSL est beaucoup moins verbeuse, et plus simple à maintenir
Il est simplement nécessaire de déclarer les packages Java à scanner, et d’écrire les routes en Java via le DSL.
Elle est également beaucoup plus sécurisée (type safe).
Il est en effet impossible de définir une opération non supportée.
De plus, l’intégralité de la syntaxe Camel est disponible en XML et via le DSL.
Le contexte Camel, cœur du framework
Afin de faire fonctionner cette route, nous avons besoin d’un contexte Camel. C’est ce contexte qui charge, configure et exécute les routes. Il s’agit véritablement du moteur du framework.
Le framework Camel n’a pas pour vocation d’être utiliser en mode standalone (excepté à des fins de tests). Camel doit être intégré à un conteneur (ServiceMix, ActiveMQ, CXF ou encore Tomcat).
Voici un exemple simple pour instancier notre contexte Camel :
-
package com.zenika.camel;
-
import org.apache.camel.CamelContext;
-
import org.springframework.beans.factory.BeanFactory;
-
import org.springframework.context.support.ClassPathXmlApplicationContext;
-
public class Testeur {
-
public static void main(String… args) throws Exception {
-
BeanFactory beanFactory = new ClassPathXmlApplicationContext(“classpath:/camel-context.xml”);
-
CamelContext camelContext = (CamelContext) beanFactory.getBean(“camelContext”);
-
camelContext.start();
-
Thread.sleep(2000); // pour avoir le temps d’exécuter la route
-
camelContext.stop();
-
}
-
}
Avec ces quelques lignes de code, nous avons très simplement mis en place une route qui copie tous les fichiers présents dans factures/in
vers factures/out
.
Nous verrons par la suite d’autres types de endpoints très utiles (comme le Direct), ainsi que des routes plus complexes avec des transformations de données et de la logique de routage.