Spring Integration permet d’utiliser le modèle de programmation de Spring pour appliquer le pattern EIP ‘Entreprise Integration Pattern’, il offre un system de communication par message avec d’autres application Spring et avec des applications externe à l’aide d’adaptateurs. Les adaptateurs fournissent un haut niveau d’abstraction.
Le principal but de SI est de fournir un model simple pour mettre en place des solutions d’intégration tous en gardant le principe de ‘separation of concerns’.
L’un des principes clé de Spring est IOC ‘Inversion Of Control’, le framework est responsable de gérer les composants de l’application qui se trouvent dans son context, les composants s’en trouvent simplifié. L’injection de dépendance DI par exemple nous soulage de nous soucié des dépendances d’un composant.
SI à les mêmes but et principes il étend le framework Spring pour y intégrer les messages qui permettent un haut niveau d’abstraction. Il supporte l’architecture message-diven avec application de IoC ce qui permet de définir les entrées et sortie des messages il supporte le routage et la transformation des messages avec différents moyen de transport et différents type de data.
Voilà donc les buts et principe de
- Fournir un model simple pour implémenter des solutions d’entreprise complexe
- Aide au faible couplage pour la modularité et la testabilité
- Renforcer le principe de separation of concerns
Composants principaux:
D’un point de vue vertical une architecture en couche facilite la separation of concern et les interfaces entre chaque couche permettent d’avoir une architecture faiblement couplé c’est de cette façon que sont faite les applications basé sur Spring ce qui nous aide a respecté se principe.
L’architecture basé sur les messages ajoute une horizontalité au principe en ajoutant à l’aide des pipes et filtre des couches horizontales.
Les filtres sont tous les composants capables de produire ou consommé des messages.
Les pipes sont les composants capables de transporter un message entre les filtres. Ce qui rend le composant faiblement couplé.
D’une manière général nous pouvons donc identifié 3 types de composant pour mettre en œuvre le Pattern EIP : Message, Canal de communication (pipe), EndPoint(filtres).

- Le Message:
Un message est une unité d’information (données) qui peut être transmise entre les différents composants (EndPoint)
Il est constitué d’un header et d’un payload.
Le payload est de la data de n’importe quel type accessible ou modifiable par le ou les destinataires du message.
Le header contient des informations requise comme l’id du message le timestamp etc., il permet aussi de transporter de l’info pour composant de transport (Channel, bridge etc.) par exemple le header peut contenir le nom du fichier contenu dans le Payload à destination des composant en attente, même chose dans le cadre d’un Outbound Mail, les paramètres (to, cc, from etc.) seront transporté dans le header

- Le Canal (Channel):
Le canal représente le pipe dans l’architecture pipe-filter.
C’est la connexion entre les différents Endpoint. L’implémentation du canal détermine où et quand le message est délivré. Deux Endpoints peuvent s’échanger des messages si ils sont connecté via le canal, la façon dont le message est délivrer dépend du type de canal utilisé. Le canal joue un rôle important dans le system faiblement couplé car le producteur et le consommateur du message ne savent rien l’un de l’autre.
Nous pouvons distinguer deux types de canal (point à point et Publish-Subscrib)
Pour les Channel Point à Point au plus un destinataire recevra le message. Spring Integration fourni plusieurs type de Channels Point à Point
QueueChannel, PriorityChannel, RendezvousChannel, DirectChannel, ExecutorChannel, et NullChannel.

Les Channel Publish/Subscribe permettent de mettre en place une relation OneToMany entre le producteur et les consommateurs du message. Le Channel transportera le message à tous souscripteurs, Le message sera supprimé du Channel une fois que tous les consommateurs auront reçu le message.

Une question importante le Channel peut-il mettre en stocke ou en buffer les messages? Les Pollable Channel le permettent en mettant à disposition une queue pour attente les messages et éviter d’overloader le destinataire, comme son nom l’indique il y’a une notion de poller qui entre en jeux, le destinataire ne pourra recevoir ce genre de message que si un Poller est défini (Poller permet de paramétrer un délai et un nombre de message a consommé)
Message Endpoint:
Le Message Endpoint est le composant connecte l’application métier au Framework de messagerie.
Pour simplifier le développement d’application EIP Spring nous évite de créer les producteur et consommateur de message, nous n’aurons pas non plus à créer les messages ni à nous soucié de l’envoi et de la réception. Le composant responsable de tous cela et le Message Endpoint cela ne veut pas dire qu’il n’y a aucun code à écrire pour connecté nos application il y’ a le routage et la transformation de data par exemple.
Le plus important étant de séparé la logique métier des interfaces d’intégration.
Le Message Endpoint représente le filtre dans l’architecture pipes-and-filters, le Message Endpoint à la responsabilité de connecté l’application au framework. L’application ne doit donc rien savoir du Message ni du Channel le transportant.
Nous pouvons en citer quelques types succinctement pour nous faire une idée générale du concept
On peut citer le Channel Adapter utilisé pour les messages unidirectionnels, il se trouve au départ et à l’arrivée d’une connexion entre deux applications. Il s’occupe de connecter l’application émettrice à l’entrée du canal et l’application destination à la sortie du canal.

Un autre type de Message Endpoint est le Messaging Gateway utilisé pour les communications bidirectionnelles.

Un autre Endpoint important est le Service Activator qui invoque un service en se basant sur le message entrant et envoi une reponse en se basant sur la valeur de retour du service:

Un Router permet de déterminer quel Channel(s) recevra le prochain message. La décision dépend du contenu payload ou des Meta-data contenu dans le header. Souvent utiliser comme alternative au Channel statique qui configure leurs outputs sur un service activator défini.

Est un autre genre de Message Endpoint le Splitter permet de diviser un message qui entre dans son input Channel, le divise en plusieurs messages et les envois un par un sur son output Channel.

L’Aggregator lui est l’exacte contraire du splitter, Ce Message Endpoint il rassemble plusieurs messages en un seul.
Un Message Transformer effectue la conversion d’un message en modifiant soit sa structure ou son contenu d’un format à un autre.
Un Filtre, comme son nom l’indique check la présence d’un booléen d’un attribut ou d’éléments dans le header pour permettre le passage du message à l’output Channel. Si la condition n’est pas rempli => exception est levé souvent utiliser dans les Channel Publish/Subscrib