Technologies

Apache Camel : Réalisez facilement vos applications orientées messages

Publié le : Auteur: Jean-Yves BESSON Laisser un commentaire
camel-box-small

Lorsque le nombre d’applications interagissant sur un même ESB augmente, le travail de son développeur devient de plus en plus complexe, d’une part parce que les technologies utilisées peuvent devenir de plus en plus hétérogènes et d’autre part parce que le nombre de contraintes métier va croissant.

Le framework Apache Camel apporte une réponse complète et efficace à cette problématique, sous forme d’une puissante toolbox qui peut considérablement réduire le travail d’intégration de vos applications sur le bus d’entreprise.

Je vous propose d’en découvrir les possibilités au travers de la réalisation d’une petite application Java/Spring illustrant son fonctionnement.

Présentation

Crée en 2007 et actuellement en version 2.15.2, ce framework écrit en Java, très léger et déjà très mature se fixe deux objectifs principaux :

  • Fournir les composants nécessaires à l’interaction avec les différentes sources du bus de données. Il en existe aujourd’hui plus d’une centaine (MQ, HTTP, SQL, File, etc…) et il est possible d’en créer de nouveaux.
  • Mettre à disposition des implémentations des designs patterns d’intégrations communs (filtre, router, dispatcher,etc…)

Il peut s’exécuter en tant qu’application Java stand-alone ou s’intégrer au sein de votre serveur d’application (via OSGI ou autre) et supporte intégralement Spring, ce qui permet de bénéficier des fonctionnalités d’injection de dépendances. De plus la communauté est très active, notamment sur le développement de composants et les documentations en ligne sont très riches.

Exemple

Cahier des charges

Pour notre projet d’exemple nous allons considérer que notre client, une banque française, doit retransmettre en temps réel ses transactions internationales à ses banques partenaires allemande et italienne. Nous prendrons les hypothèses simplificatrices suivantes :

  • Chaque transaction sera représentée par un pojo simple, contenant uniquement le montant de la transaction et le trigramme du pays de destination. Les transactions dont le montant est supérieur à 10000 euros ne seront pas émises car elles seront traitées par une autre application.
  • Notre application recevra les transactions sous forme de message MQ et devra soit les publier sur un web service mis à disposition par la banque italienne soit les enregistrer dans une base de données de la banque allemande.

Le routage des transactions par notre application peut donc se schématiser :

camel_use_case

Implémentation

Pré-requis

Un simple projet Java/Spring/Maven, incluant les dépendances au core de camel et aux différents composants utilisés (camel-mq et camel-jdbc) est nécessaire à l’exécution de notre application.

Création d’un contexte Camel et des endpoints

Tout comme Spring, Camel permet de définir un ou plusieurs contextes applicatifs, qui définissent les terminaisons du bus, appelées endpoint et les liaisons logiques à réaliser, appelées route. Les développements peuvent être réalisés soit en XML à l’intérieur de Spring, soit en pur Java au moyen d’une DSL spécifique (non présentée ici).

En XML, le contexte et les endpoints de notre application se représentent de la manière suivante :

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans">
        <camelContext>
            <endpoint id="banqueFRA" uri="activemq:queueFRA" />
            <endpoint id="banqueITA" uri="http:www.banque.ita/transaction" />
            <endpoint id="banqueGER" uri="jdbc:banqueGERDataSource" /
        </camelContext>
</beans>

Chaque endpoint déclare une uri permettant à Camel d’identifier et de paramétrer le composant à charger, respectant le modèle suivant :

[nom du composant camel] :[identifiant] ?[paramètres]

L’intérêt de cette syntaxe est de normaliser les appels aux endpoints, le développeur fait donc l’économie de l’apprentissage des api derrière chaque technologie utilisées (dans le cas présent JMS, JDBC et JAX-RS).

Définition de la route

Une fois nos endpoints déclarés, Camel va s’occuper de nous connecter à la queue ActiveMQ, au webservice et à la datasource. Pour implémenter la logique métier, nous allons définir une route depuis le endpoint d’entrée (balise from) vers les endpoints de sortie (balise to) :

<route>
    <from ref="banqueFRA" />
        <filter>
            <xpath>$transaction.montant < '10000'</xpath>
            <choice>
                <when>
                    <xpath>$transaction.trigram = 'ITA'</xpath>
                    <to ref="banqueITA" />
                </when>
                <when>
                    <xpath>$transaction.trigram = 'GER'</xpath>
                    <to ref="banqueGER" />
                </when>
            </choice>
        </filter>
</route>

Chaque étape du routage est définie via des balises XML correspondant au pattern d’intégration souhaité. Les conditions sont exprimées ici via des predicates en syntaxe xpath (balises xpath).

Résultat

Au démarrage du contexte, Camel va consommer les messages MQ et prendre en charge le routage en appliquant sur chaque échange les règles métiers définies vers les endpoints de sorties.

Conclusion

Cet exemple, bien que très simpliste, n’utilise qu’une infime partie de la boîte à outil Camel mais nous montre que le framework a fourni defacto la totalité des apis dont nous avions besoin. En effet, nous avons pu réaliser le routage aux conditions voulues depuis diverses technologies et ce sans écrire de code Java. Si nous avions choisi de développer cette application de manière classique, il nous aurait fallu prendre en main les apis, définir une architecture d’échange et donc écrire beaucoup de code.

Bien entendu, le framework ne se limite pas à cela et il propose de nombreux autres fonctionnalités comme la gestion des erreurs de transmissions (redelivery, timeout, etc…), les statistiques et le paramétrage à chaud qui feront peut être l’objet d’un prochain billet.

Références

http://camel.apache.org/

http://www.enterpriseintegrationpatterns.com/