Spring Integration est depuis 2009 et dans sa version 1.0.3, un nouveau membre affirmé du portefeuille Spring dont il étend les possibilités :
- Basé sur les messages où l’inversion du contrôle s’applique aux problèmes d’exécution, tels que le moment où certaines logiques métier doivent s’exécuter et où la réponse doit être envoyée.
- Il prend en charge le routage et la transformation des messages afin que différents transports et différents formats de données puissent être intégrés sans impact sur la testabilité. En d’autres termes, les problèmes de messagerie et d’intégration sont traités par le framework, de sorte que les composants métier sont davantage isolés de l’infrastructure et les développeurs sont libérés de leurs responsabilités d’intégration complexes.
Spring intégration permet une messagerie légère dans les applications basées sur Spring et prend en charge l’intégration avec des systèmes externes via des adaptateurs déclaratifs. Ces adaptateurs offrent un niveau d’abstraction plus élevé tel que la prise en charge de Spring pour la communication à distance, la messagerie et la planification. L’objectif principal de Spring Integration est de fournir un modèle simple pour créer des solutions d’intégration d’entreprise tout en maintenant la séparation des préoccupations qui est essentielle pour produire du code testable et maintenable.
Dans cet article nous déclinerons les principes de ce module, examinerons les besoins spécifiques que cette bibliothèque remplit dans une application d’entreprise et pourquoi elle est recommandée par rapport à certaines de ses alternatives. Nous examinerons également certains outils disponibles pour simplifier davantage le développement d’applications basées sur Spring intégration.
Principes et objectifs
Spring intégration suit les principes suivants:
- Couplage lâche entre composants pour faciliter la modularité et la testabilité.
- Respect de la séparation des préoccupations (separation of concerns) entre la logique métier et la logique d’intégration.
- Points d’extension abstraits mais clairement définis afin de promouvoir la réutilisation et la portabilité.
Ainsi les objectifs du projet sont clairs:
- Fournir un modèle simple pour implémenter des solutions complexes d’intégration d’entreprise; on ne parle plus de conteneur, d’APIs sophistiquées de connecteurs, de registre de services, de structures de données complexes comme dans les précédents ESB.
- Faciliter la mise en place de modèles d’échanges asynchrones orientés messages au sein d’une application basée sur Spring.
- L’éloignement des standards très coûteux éditeurs (Java Business Integration – JBI et Service Component Architecture – SCA) pour se cantonner à des Plain Old Java Objects (POJO).
Spring Integration propose une large sélection de mécanismes pour communiquer avec des systèmes externes. Les adaptateurs de canaux sont l’un de ces mécanismes utilisés pour l’intégration unidirectionnelle (send ou receive). Et les passerelles sont utilisées pour les scénarios de demande / réponse (entrants ou sortants).
Plusieurs features sont disponibles . Spring integration fournit le support (adapters) pour l’envoie et la réception de message depuis/ vers des systèmes externes(AMQP, JMS,….) , ou encore le support pour des bases de données SQl et NoSQl tel Redis ou MongoDb.
Principaux Composants
Les Messages
Il s’agit là du composant central. Un message est un wrapper générique pour tout objet Java combiné aux métadonnées utilisées par le framework lors de la gestion de cet objet. Il se compose d’une charge utile et d’en-têtes. La charge utile peut être de tout type et les en-têtes contiennent les informations généralement requises telles que l’identifiant, l’horodatage, l’expiration et l’adresse de retour.
Les Messages Channels
Le principe d’échange de messages proposé par Spring intégration étant basé sur le model Pipes and Filters , le Message channel représente le “Pipe” , il définit le canal par lequel transitent les messages. Plusieurs implémentations de ce composant sont proposés afin de couvrir un large panel de possibilités.
Message Endpoint
Dans la même logique, la partie filters du modèle Pipe and filters est représentée par les points de terminaison de message (message endpoint) permettant de connecter une source vers un channel ou inversement un channel vers une cible.
L’un des principaux objectifs de Spring Integration est de simplifier le développement de solutions d’intégration d’entreprise par inversion de contrôle. L’on n’aura pas à se soucier d’implémenter directement les consommateurs (consumer) et les producteurs (producer) ou de créer des messages et appeler des opérations d’envoi ou de réception sur un canal de message (sepapration of concerns).
Spring integration prendra tout cela en charge par simple configuration xml déclarative ou par annotation (java DSL) et non invasive. l’objectif étant de connecter du code spécifique à l’infrastructure existante grâce notamment à ce composant.
Redis
Redis est un système de stockage de données en mémoire vive extrêmement rapide. Il peut également persister sur un disque. Il prend en charge différentes structures de données comme de simples paires clé-valeur, des ensembles, des files d’attente, etc. On peut ainsi l’utiliser comme base de données ou cache.
Comment fonctionne Redis ?
Redis contrairement aux bases de données traditionnelles stockent les données en mémoire et non sur disque ou SSD, ce qui accroît considérablement le temps de recherche; les applications peuvent y accéder en quelques microsecondes.
Redis propose des structures de données polyvalentes, une haute disponibilité, les transactions, la persistance sur disque et la prise en charge des clusters, ce qui simplifie la création d’applications à l’échelle en temps réel sur Internet.
Avantages de Redis
L’utilisation de Redis comme file d’attente facilite le partage de données entre les composants et la mise à l’échelle horizontale.
Un producteur ou plusieurs producteurs peuvent envoyer des données à la file d’attente, et un ou plusieurs consommateurs peuvent extraire les données et traiter l’événement.
Plusieurs consommateurs ne peuvent pas consommer le même événement, ce qui garantit qu’un seul événement est traité une fois.
On pourrait également citer comme avantages :
- L’exécution parallèle de tâches discrètes de manière non bloquante
- Belle performance et bonne stabilité
- Surveillance et débogage faciles
- Mise en œuvre et utilisation faciles
Spring Integration et redis: Application
En application, nous allons prendre pour cas , la récupération d’une liste de commandes. La liste de commandes sous forme csv sera consommée par un point d’entrée (Message endpoint) puis traitée par un channel adapter afin de récupérer chaque commande.Toutes les commandes seront stockées temporairement dans redis ensuite chacune d’elle sera envoyée dans un message channel puis divisée en différents messages en fonction de leur attributs et envoyé pour affichage vers un channel.
Prérequis:
- installation d’un serveur redis
- Les dépendances Maven suivants sont nécessaires :
- Jedis est un client Redis.
- La dépendance spring-data-redis facilite l’utilisation de Redis en Java. Il fournit des concepts Spring familiers tels qu’une classe modèle pour l’utilisation de l’API de base et un accès léger aux données de style référentiel.
- spring-intégration-redis, fournit une extension du modèle de programmation Spring pour prendre en charge les modèles d’intégration d’entreprise bien connus.
Nous procéderons par configuration xml dans le cadre de cet exemple.
Création du fichier xml dans le répertoire de ressource de votre projet spring.
Configuration générale :
Lignes 23- 29 : Définition de messages channel. <int:queue message-store= »redisMessageStore » /> , permet de persister dans redis les données transitant par le channel.
Ligne 36-41 : utilisation de l’adaptateur “inbound-channel-adapter” qui permet de lire le fichier excel depuis le répertoire spécifié par l’attribut directory.
<int:poller max-messages-per-poll= »5″ fixed-delay= »1000″/> est obligatoire dès lors que les données transitant par un channel doivent être persistées. il définit la fréquence et le nombre de message pouvant transiter sur un canal par requête.
lignes 38-51: Ajout de l’instance redis par injection de dépendances. les valeurs redis.host, redis.port , redis.pass définissent les respectivement le nom du serveur redis, le port , et le mot de passe.
Lignes 45-49 : Le message transformer “file-to-string-transformer”, permet de transformer une le fichier en entrée du channel (input-channel= »csvOrderFileInChannel ») en une chaîne de caractère et redirige le résultat vers la channel toStrings( output-channel= »toStrings »).
Lignes 53-58 : le composant chain , permet de définir une succession de traitements réalisée en bloc sur un même message.
<int:splitter ref= »mysplitter » /> : permet de splitter la chaîne de caractère pour constituer une liste.
Le traitement est défini dans la classe définit à la ligne 70 et référencée par mysplitter.
<int:transformer ref= »orderTransformer » method= »transform » /> : transforme par la suite la liste en objet Order.
ligne 61 : le composant service-activator permet de définir un service pour l’affichage.
ligne 64: Redirige le résultat vers la console.
La classe Order :
Une commande a trois attributs : id, sa valeur et le type de paiement
La classe OrderTransformer:
Exemple fichier csv de commandes.
Pour le test lancer l’application java puis déposer le fichier dans le répertoire défini (inbound.demo.csvorder.in.directory).
Résultat en console : le fichier est consommé et le résultat sur le console.
Ce module de Spring permet l’intégration de données et échanges rapides de messages pour pratiquement aucun coût.
Avec une prise en main assez facile , Redis associé à Spring integration rend trivial les échanges de données entre systèmes hétérogènes.
En couplant spring Integration et redis, la création d’une application de microservices spring ne saurait plus être aussi intimidante qu’elle le serait normalement. Une petite configuration et une petite quantité de code passe-partout, et l’on peut construire les bases d’une architecture de micro service en un rien de temps.