SlideShare a Scribd company logo
1 of 25
Workshop Spring - Session 5
Etudes de cas
Spring Intégration
Diffusé en novembre 2013
Réactualisé en janvier 2015
Sommaire
Introduction à Spring Integration 3
Présentation de l’étude de cas 6
Implémentation avec Spring Integration 11
Conclusion 23
Workshop Spring Integration – Etude de Cas
2
Introduction
• Le messenging est une technique d’intégration entre
applications
– Souvent basé sur un Message Oriented Middleware (MoM)
• Permet 3 formes de Découplage :
• Spatial
• Temporel
• Logique
• Certains partisans poussent son Utilisation Au sein même
d’une même application
• Composants échangeant des données par messages en mémoire
• Applications orientées évènements
• Adaptateurs permettant de se connecter à des systèmes externes
3
Communication par messages
Introduction
• Livre cataloguant les patterns de type messaging utilisés
en entreprise pour architecturer le SI
– Ecrit par Gregor Hohpe et Bobby Woolf
• Standardisation de concepts MOM
• Liste de Patterns et iconographie
• Message
• Contient des En-têtes et un Contenu (Payload)
• Channel
• Point à Point ou de type Publish / Subscribe
• Envoi bloquant ou asynchrone
• Endpoint
• Connecte les Channels au code applicatif
et aux systèmes externes
4
Enterprise Integration Patterns (EIP)
Introduction
• Implémentation des Enteprise integration patterns
• Apache CAMEL en est une autre
• Repose sur le framework Spring et de
nombreux projets
• Reste un simple Framewok
• Offre de nombreux adapateurs :
• JMS
• JDBC, JPA, Mongo DB, REDIS
• HTTP, TCP / UDP
• Fichier, FTP, SFTP
• RSS, ATOM
• Mail, Twitter, XMPP, XML, Web services, RMI
5
Spring Intégration
Présentation de l’étude de cas
• Application de recherche et d’indexation
o Basée sur le moteur Elasticsearch
o Données métier issues de différents
référentiels et Back Office
• Indexation des données au fil de l’eau
o Mise en œuvre au sein d’une architecture SOA
o Exploitant l’infrastructure existante (ESB)
6
Application Indexo
Notification asynchrone envoyée à Indexo par JMS lors d’une création /
modification / suppression d’un ou plusieurs Produits
Consultation des données produits par appel d’un web service SOAP
Construction puis écriture du document à indexer dans Elasticsearch
7
Présentation de l’étude de cas
Communication entre applications
Serveur
Elasticsearch
Indexo
Module
d’indexation fil
de l’eau
Produx
Référentiel
Produits
ESB
JMS / XML
HTTP / SOAP
TCP / JSON
1
1
2
2
3
3
8
A format XML, une notification est composée de 2 parties :
1. En-tête technique : standardisé par le framework de notification de l’ESB
2. Partie métier : spécifique à l’application Indexo
• Cartouche technique :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Notification xmlns="http://v1.event.esb.javaetmoi.com">
<Header>
<Label>Business Object Domain Changes</Label>
<SentTime>2015-01-12T21:10:30+02:00</SentTime>
<Version>1</Version>
<MessageNumber>1456098922309</MessageNumber>
<Origin>PRODUX</Origin>
<Type>BODC</Type>
</Header>
<Body>Notification métier</Body>
</Notification>
Utilisé par l’ESB:
• Filtrage
• Routage JMS
Contenu
au format XML
Présentation de l’étude de cas
Notifications (1/2)
• Partie Métier
• Contient les informations relatives à la modification d'un ou plusieurs
objets métiers
• Spécifiée par une XSD (au même titre que le cartouche technique)
9
Présentation de l’étude de cas
Notifications (2/2)
Propriété Type Description
action Enumération Action de création, de modification ou de
suppression d'un objet métier
actionDate Timestamp Date et heure à laquelle l'action a eu lieu
businessId String Identifiant métier de l'objet mis à jour
objectTypeCode String Contient le nom des objets métiers du
dictionnaire d'entreprise
10
1. Lecture de la notification à partir de la file JMS
2. Filtrage à partir du cartouche technique
Permet d’écarter les notifications non destinées à Indexo
3. Traitement des erreurs
Fichier de logs et envoi de mails
4. Extraction puis unmarshalling XML de la partie métier
5. Séparation en informations de mise à jour unitaire
6. Routage en fonction de l’action
Le traitement des notifications de suppression est
transverse à tous les objets métiers
7. Routage en fonction du type d’objet métier
8. Récupération des données à indexer
Appel du ou des web services SOAP ou REST de consultation
9. Construction du document Lucene à indexer
10.Ecriture du document dans Elasticsearch
Présentation de l’étude de cas
Décomposition du traitement des notifications
Implémentation avec Spring Intégration
• Beans d’infrastructure du contexte applicatif Spring
• Connection Fatory JMS, File JMS (lookup JNDI ou standalone)
• Pools de threads (TaskExecutor)
• Marshaller JAXB 2 (Spring OXM)
• Clients Spring Web Services
• Client Elasticsearch
• Mise en œuvre basée sur Spring Integration 2.2.0
• Le JAR spring-integration-core + autant de jar que de technologies
supportées utilisées
• Configuration de Spring Integration
• Fichier de configuration XML avec espaces de nommage dédiés :
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-xml="http://www.springframework.org/schema/integration/xml"
• Annotations @MessageEndpoint, @Header, @Payload, @Gateway …
11
Mise en place de l’Architecture applicative
<!-- Fabrique de connexions JMS du broker de l’ESB -->
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="IndexoEventCF">
<jee:environment>
java.naming.factory.initial=xxx
java.naming.provider.url=yyy
</jee:environment>
</jee:jndi-lookup>
<task:executor id="businessChangeTaskExecutor"
pool-size="10-40"/>
<task:executor id="errorTaskExecutor"/>
<!-- Unmarshaller JAXB 2 de la partie métier de la notification -->
<oxm:jaxb2-marshaller id="businessEventUnmarshaller"
contextPath="com.javaetmoi.indexo.model.event.business.v1"/> 12
Définition des beans d’Infrastructure
Accès à l’annuaire JNDI
distant de l’ESB
Pools de threads dédiés à la
gestion des erreurs et aux
traitements de chaque objet
métier à indexer
Implémentation avec Spring Intégration
Implémentation avec Spring Intégration
• Utilisation du pattern Channel Adapter
• Connecte un channel avec des systèmes ou des services de transports externes
• 2 types de Channel Addapter : Inbound ou Outbound
• Uni-directionnel
• Implémentation retenue dans Spring Integration :
– Adapteur JMS entrant de type Message Driven
<int-jms:message-driven-channel-adapter
destination="EventQueue"
channel="jmsEventChanel" />
<int:channel id="jmsEventChanel" />
13
Etape 1 : Lecture de la notification à partir de la file JMS
Nom de la file JMS
en entrée d’Index
Channel dans lequel
le GenericMessage
est déposé
Implémentation avec Spring Intégration
• Utilisation du pattern Message Filter
• Décide de faire passer ou non un message vers le output
channel
• Par défaut : un message filtré est ignoré
• Autre configuration possible : levée d’une exception
ou message routé dans un discard-channel
• Implémentation retenue dans Spring Integration :
– Filtre XML par expression XPath
<int-xml:xpath-filter
input-channel="jmsEvenChannel"
output-channel="indexoEventChannel"
discard-channel="unexpectedEventChannel">
<int-xml:xpath-expression expression=
"/Notification/Header/Type = 'BODC'"/>
</int-xml:xpath-filter> 14
Etape 2 : Filtrage à partir du cartouche technique
Notification de type
BODC dédiée à Indexo
Notifications
invalides routées
dans un channel
Implémentation avec Spring Intégration
• Patterns Publish-Subscribe, Content Enricher et
Channel Adapter
– Génération d’un log d’erreur et envoi d’un email en
simultanés
<publish-subscribe-channel id="unknownEventChannel"
task-executor="errorTaskExecutor"/>
<logging-channel-adapter channel="unknownEventChannel" level="ERROR"
expression=« 'Unknown message: ' + payload.failedMesssage.payload"/>
<chain input-channel="unknownEventChannel"/>
<int-mail:header-enricher>
<int-mail:subject value="Unknown message"/>
<int-mail:to value="support@javaetmoi.com"/>
</int-mail:header-enricher>
<int-mail:outbound-channel-adapter host="mailserver" port="1021"/>
</chain>
15
Etape 3 : Traitement des erreurs
Non Bloquant
Abonnés appelés
en parallèle
Ajoute les en-
têtes mail_subject
et mail_to
Implémentation avec Spring Intégration
• Pattern de transformation de messages
– Seule la partie métier est nécessaire à l’indexation
– Utilisation du unmarshaller XML JAXB 2 proposé par
Spring OXM
• Implémentation basée sur le support XML de Spring
Intégration
<chain input-channel="indexoEventChannel"
output-channel="businessEventChannel"/>
<int-xml:xpath-transformer
xpath-expression="/Notification/Body"
evaluation-type="NODE_RESULT" />
<int-xml:unmarshalling-transformer
unmarshaller="businessEventUnmarshaller"/>
</chain> 16
Etape 4 : Extraction puis unmarshalling de la partie métier
Implémentation avec Spring Intégration
• Utilisation du pattern Message Splitter
• Découpe un message en plusieurs messages.
• Permet de segmenter le traitement d’un payload « composite » avec possibilité de
regroupement
• Implémentation avec chaque sous-message traité en parallèle :
public class BusinessDomainEventSplitter {
List<BusinessDomainChange> split(BusinessDomainEvent event) {
return event.getChanges();
} }
<context:bean id="businessDomainEventSplitter"
class="com...BusinessDomainEventSplitter"/>
<splitter input-channel="businessEventChannel"
output-channel="businessChangeChannel"
ref="businessDomainEventSplitter"/>
<channel id="businessChangeChannel">
<dispatcher task-executor="businessChangeTaskExecutor"/>
</channel>
17
Etape 5 : Séparation en informations de mise à jour unitaire
Implémentation avec Spring Intégration
• Utilisation du pattern Message Router
• Décide dynamiquement vers quel(s) channel(s) un message doit être
envoyé
• La décision est généralement fonction des en-têtes ou du contenu
• Implémentation à l’aide d’une Spring Expression Language (SpEL) :
<recipient-list-router input-channel="businessChangeChannel">
<recipient channel="objetUpdateChannel"
selector-expression="payload.action.equals(UPDATE)"/>
<recipient channel="objetDeleteChannel"
selector-expression="payload.action.equals(DELETE)"/>
</recipient-list-router>
• Configuration simplifiée :
<router input-channel="businessChangeChannel"
expression="'object' + payload.action + 'channel'" />
18
Etape 6 : Routage en fonction de l’action
Implémentation avec Spring Intégration
• Utilisation une 2nde fois du pattern Message Router
• Exemple de configuration par annotations :
<context:component-scan
base-package="com.javaetmoi.indexo.endpoint"/>
@MessageEndpoint
public class ModificationObjetMetierRouter {
@Router(inputChannel="objetUpdateChannel")
public String route(BusinessDomainChange payload) {
return payload.getObjetTypeCode() +"UpdateChannel";
}
}
19
Etape 7 : Routage en fonction du type d’objet métier
Nom de l’OuputChannel dans le cas d’une mise à jour
d’un produit : « productUpdateChannel »
Auto-détection des beans Spring
par analyse de package java
Implémentation avec Spring Intégration
• Utilisation du pattern Gateway
• Masque l’API de messaging de Spring Integration
• Une Outbound Gateway fait appel à un système externe et renvoie la réponse dans
l’application (sous forme de Message)
• Une Inbound Gateway fait rentrer des messages dans l’application et attend la réponse
• Implémentation à l’aide du support Web Services de SI :
– Fait appel au WS SOAP Produx de consultation d’un produit
<int-ws:outbound-gateway
request-channel="productUpdateChannel"
reply-channel="productDtoChannel"
destination-provider="wsProductClient"
marshaller="productMarshaller"
unmarshaller="productUnmarshaller"/>
20
Etape 8 : Récupération des données Poduits à indexer
Marshalling
manuel via
JDOM :
l’identifiant du
produit est
utilisé comme
paramètre
d’appel du WS
Le produit retourné par le WS est unmarshallé dans un
ProductDto via JAXB2
Implémentation avec Spring Intégration
• Utilisation du pattern Service Activator
• Endpoint générique connectant un service métier au système de messagerie de SI
• L’opération d’un service est invoquée pour traiter le message reçu sur l’input-channel
• La réponse est encapsulée dans un message émis sur le output-channel ou le replyChannel
@Service("productProcessorService")
public class ProcessorServiceImpl
implements ProductProcessorService {
@Override
public ProductDocument process(
DtoProduct product) { … }
}
<service-activator input-channel="productDtoChannel"
output-channel="productDocumentChannel"
ref="productProcessorService" method="process"/>
21
Etape 9 : Construction du document Lucene à indexer
Transforme les
données
produits en un
document
indexable par
Elasticsearch
Implémentation avec Spring Intégration
• Nouvelle utilisation du pattern Service Activator
@Service("productIndexWriterService")
public class ProductIndexWriterImpl
implements ProductIndexWriter {
@Autowired private Client esClient;
public void write(ProductDocument item) {
IndexRequestBuilder req = esClient
.prepareIndex(« indexo","product", item.getId());
req.setSource(ESContentBuilder.buildContent(item));
esClient.index(req);
} }
<service-activator input-channel="productDtoChannel"
ref="productIndexWriterService" method="write"/>
22
Etape 10 : Ecriture du document Dans Elasticsearch
Conclusion
• Plaisant malgré une phase d’apprentissage non négligeable
• Jeu de lego à l’aide de nombreuses briques
• Utilisation sur étagère
• Couplage Lâche facilitant les tests et la réutilisabilité
• Service métier réutilisé dans les batchs d’indexation
• Facilite la mise en place de modèles d’échanges asynchrones
orientés messages au sein d’une application basée sur Spring
• Simple paramétrage des channels
• Séparation des préoccupations entre la logique métier et la
logique d’intégration
• Spring Intégration Fourni la plomberie et des extensions pour les
connectivités
23
Bilan de l’étude de cas
Conclusion
• Polling de channels passifs
– Cadencement des traitements
• Failover et load-balancing
– Répartition de la charge induite par le traitement des messages et mode
dégradé
• Bridge
– Connecte 2 channels
• Intercepteurs
– Positionnés globalement ou sur chaque channel, pattern wire-tap
• Gestion des transactions
– Propagation du contexte transactionnel
• Message Store
– Persistance JMS ou base de données
• API de Construction des messages
– API fluent de construction de messages et de leurs en-têtes 24
Pour aller plus loin (1/2)
• Site et Manuel de référence de Spring Intégration
• http://www.springsource.org/spring-integration
• 331 pages, concepts, description détaillée, exemples complets
• Site de référence dess EIPS :
http://www.enterpriseintegrationpatterns.com
• Livres sur Spring Intégration
• Just Spring Integration
• Spring Integration in action
• Pro Spring Integration
• Code source sur Github
• Spring Tool Suite (STS)
• Modélisation Graphique
Conclusion
25
Pour aller plus loin (2/2)

More Related Content

What's hot

Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
Presentation of framework Angular
Presentation of framework AngularPresentation of framework Angular
Presentation of framework AngularLhouceine OUHAMZA
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & ActuatorsVMware Tanzu
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
What Is Express JS?
What Is Express JS?What Is Express JS?
What Is Express JS?Simplilearn
 
Alphorm.com Java 8: les nouveautés
Alphorm.com Java 8: les nouveautésAlphorm.com Java 8: les nouveautés
Alphorm.com Java 8: les nouveautésAlphorm
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Visual Engineering
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSyrine Ben aziza
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemeStéphane Traumat
 

What's hot (20)

Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Spring Boot RestApi.pptx
Spring Boot RestApi.pptxSpring Boot RestApi.pptx
Spring Boot RestApi.pptx
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Presentation of framework Angular
Presentation of framework AngularPresentation of framework Angular
Presentation of framework Angular
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Spring Boot & Actuators
Spring Boot & ActuatorsSpring Boot & Actuators
Spring Boot & Actuators
 
Express node js
Express node jsExpress node js
Express node js
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
What Is Express JS?
What Is Express JS?What Is Express JS?
What Is Express JS?
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Introduction Node.js
Introduction Node.jsIntroduction Node.js
Introduction Node.js
 
Alphorm.com Java 8: les nouveautés
Alphorm.com Java 8: les nouveautésAlphorm.com Java 8: les nouveautés
Alphorm.com Java 8: les nouveautés
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 

Viewers also liked

Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8Antoine Rey
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
pessimistic-development-presentation
pessimistic-development-presentationpessimistic-development-presentation
pessimistic-development-presentationJonathan Marbutt
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Learned optimism
Learned optimismLearned optimism
Learned optimismAndrew Chaa
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Richard Banks
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample applicationAntoine Rey
 

Viewers also liked (13)

Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
pessimistic-development-presentation
pessimistic-development-presentationpessimistic-development-presentation
pessimistic-development-presentation
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Learned optimism
Learned optimismLearned optimism
Learned optimism
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016Microservices with .Net - NDC Sydney, 2016
Microservices with .Net - NDC Sydney, 2016
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample application
 

Similar to Workshop Spring - Session 5 - Spring Integration

Formation Efficy CRM - Technical training
Formation Efficy CRM - Technical trainingFormation Efficy CRM - Technical training
Formation Efficy CRM - Technical trainingEfficy CRM
 
ASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardPatrice Vialor
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASGuillaume Sauthier
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?GreenIvory
 
cours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfcours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfSliimAmiri
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Microsoft
 
BreizhCamp - Drupal7 dans le cloud avec Azure
BreizhCamp - Drupal7 dans le cloud avec AzureBreizhCamp - Drupal7 dans le cloud avec Azure
BreizhCamp - Drupal7 dans le cloud avec AzureNicolas Georgeault
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasMicrosoft
 
GlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGGlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGCh'ti JUG
 
ImpressCMS Persistable Framework: Développement de modules en accéléré
ImpressCMS Persistable Framework: Développement de modules en accéléréImpressCMS Persistable Framework: Développement de modules en accéléré
ImpressCMS Persistable Framework: Développement de modules en accéléréINBOX International inc.
 
eServices-Chp4: ESB
eServices-Chp4: ESBeServices-Chp4: ESB
eServices-Chp4: ESBLilia Sfaxi
 
Dossier de competences MA
Dossier de competences MADossier de competences MA
Dossier de competences MAClementine D.
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flexdavid deraedt
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flexdavid deraedt
 
Supervision et analyse de script batch
Supervision et analyse de script batchSupervision et analyse de script batch
Supervision et analyse de script batchschomy
 
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...Microsoft Décideurs IT
 

Similar to Workshop Spring - Session 5 - Spring Integration (20)

Formation Efficy CRM - Technical training
Formation Efficy CRM - Technical trainingFormation Efficy CRM - Technical training
Formation Efficy CRM - Technical training
 
ASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages StandardASI INFORMATIQUE - Cursus de formation XPages Standard
ASI INFORMATIQUE - Cursus de formation XPages Standard
 
Java Server Faces 2
Java Server Faces 2Java Server Faces 2
Java Server Faces 2
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnAS
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?
 
cours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdfcours8-GL-minfo-1718.pdf
cours8-GL-minfo-1718.pdf
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5
 
BreizhCamp - Drupal7 dans le cloud avec Azure
BreizhCamp - Drupal7 dans le cloud avec AzureBreizhCamp - Drupal7 dans le cloud avec Azure
BreizhCamp - Drupal7 dans le cloud avec Azure
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de Jonas
 
RAD avec IPF pour ImpressCMS 1.2
RAD avec IPF pour ImpressCMS 1.2RAD avec IPF pour ImpressCMS 1.2
RAD avec IPF pour ImpressCMS 1.2
 
GlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGGlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUG
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
ImpressCMS Persistable Framework: Développement de modules en accéléré
ImpressCMS Persistable Framework: Développement de modules en accéléréImpressCMS Persistable Framework: Développement de modules en accéléré
ImpressCMS Persistable Framework: Développement de modules en accéléré
 
eServices-Chp4: ESB
eServices-Chp4: ESBeServices-Chp4: ESB
eServices-Chp4: ESB
 
Dossier de competences MA
Dossier de competences MADossier de competences MA
Dossier de competences MA
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Supervision et analyse de script batch
Supervision et analyse de script batchSupervision et analyse de script batch
Supervision et analyse de script batch
 
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...
Découvrez comment l’ECM peut concrètement « BOOSTER » votre entreprise à trav...
 

Workshop Spring - Session 5 - Spring Integration

  • 1. Workshop Spring - Session 5 Etudes de cas Spring Intégration Diffusé en novembre 2013 Réactualisé en janvier 2015
  • 2. Sommaire Introduction à Spring Integration 3 Présentation de l’étude de cas 6 Implémentation avec Spring Integration 11 Conclusion 23 Workshop Spring Integration – Etude de Cas 2
  • 3. Introduction • Le messenging est une technique d’intégration entre applications – Souvent basé sur un Message Oriented Middleware (MoM) • Permet 3 formes de Découplage : • Spatial • Temporel • Logique • Certains partisans poussent son Utilisation Au sein même d’une même application • Composants échangeant des données par messages en mémoire • Applications orientées évènements • Adaptateurs permettant de se connecter à des systèmes externes 3 Communication par messages
  • 4. Introduction • Livre cataloguant les patterns de type messaging utilisés en entreprise pour architecturer le SI – Ecrit par Gregor Hohpe et Bobby Woolf • Standardisation de concepts MOM • Liste de Patterns et iconographie • Message • Contient des En-têtes et un Contenu (Payload) • Channel • Point à Point ou de type Publish / Subscribe • Envoi bloquant ou asynchrone • Endpoint • Connecte les Channels au code applicatif et aux systèmes externes 4 Enterprise Integration Patterns (EIP)
  • 5. Introduction • Implémentation des Enteprise integration patterns • Apache CAMEL en est une autre • Repose sur le framework Spring et de nombreux projets • Reste un simple Framewok • Offre de nombreux adapateurs : • JMS • JDBC, JPA, Mongo DB, REDIS • HTTP, TCP / UDP • Fichier, FTP, SFTP • RSS, ATOM • Mail, Twitter, XMPP, XML, Web services, RMI 5 Spring Intégration
  • 6. Présentation de l’étude de cas • Application de recherche et d’indexation o Basée sur le moteur Elasticsearch o Données métier issues de différents référentiels et Back Office • Indexation des données au fil de l’eau o Mise en œuvre au sein d’une architecture SOA o Exploitant l’infrastructure existante (ESB) 6 Application Indexo
  • 7. Notification asynchrone envoyée à Indexo par JMS lors d’une création / modification / suppression d’un ou plusieurs Produits Consultation des données produits par appel d’un web service SOAP Construction puis écriture du document à indexer dans Elasticsearch 7 Présentation de l’étude de cas Communication entre applications Serveur Elasticsearch Indexo Module d’indexation fil de l’eau Produx Référentiel Produits ESB JMS / XML HTTP / SOAP TCP / JSON 1 1 2 2 3 3
  • 8. 8 A format XML, une notification est composée de 2 parties : 1. En-tête technique : standardisé par le framework de notification de l’ESB 2. Partie métier : spécifique à l’application Indexo • Cartouche technique : <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Notification xmlns="http://v1.event.esb.javaetmoi.com"> <Header> <Label>Business Object Domain Changes</Label> <SentTime>2015-01-12T21:10:30+02:00</SentTime> <Version>1</Version> <MessageNumber>1456098922309</MessageNumber> <Origin>PRODUX</Origin> <Type>BODC</Type> </Header> <Body>Notification métier</Body> </Notification> Utilisé par l’ESB: • Filtrage • Routage JMS Contenu au format XML Présentation de l’étude de cas Notifications (1/2)
  • 9. • Partie Métier • Contient les informations relatives à la modification d'un ou plusieurs objets métiers • Spécifiée par une XSD (au même titre que le cartouche technique) 9 Présentation de l’étude de cas Notifications (2/2) Propriété Type Description action Enumération Action de création, de modification ou de suppression d'un objet métier actionDate Timestamp Date et heure à laquelle l'action a eu lieu businessId String Identifiant métier de l'objet mis à jour objectTypeCode String Contient le nom des objets métiers du dictionnaire d'entreprise
  • 10. 10 1. Lecture de la notification à partir de la file JMS 2. Filtrage à partir du cartouche technique Permet d’écarter les notifications non destinées à Indexo 3. Traitement des erreurs Fichier de logs et envoi de mails 4. Extraction puis unmarshalling XML de la partie métier 5. Séparation en informations de mise à jour unitaire 6. Routage en fonction de l’action Le traitement des notifications de suppression est transverse à tous les objets métiers 7. Routage en fonction du type d’objet métier 8. Récupération des données à indexer Appel du ou des web services SOAP ou REST de consultation 9. Construction du document Lucene à indexer 10.Ecriture du document dans Elasticsearch Présentation de l’étude de cas Décomposition du traitement des notifications
  • 11. Implémentation avec Spring Intégration • Beans d’infrastructure du contexte applicatif Spring • Connection Fatory JMS, File JMS (lookup JNDI ou standalone) • Pools de threads (TaskExecutor) • Marshaller JAXB 2 (Spring OXM) • Clients Spring Web Services • Client Elasticsearch • Mise en œuvre basée sur Spring Integration 2.2.0 • Le JAR spring-integration-core + autant de jar que de technologies supportées utilisées • Configuration de Spring Integration • Fichier de configuration XML avec espaces de nommage dédiés : xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-xml="http://www.springframework.org/schema/integration/xml" • Annotations @MessageEndpoint, @Header, @Payload, @Gateway … 11 Mise en place de l’Architecture applicative
  • 12. <!-- Fabrique de connexions JMS du broker de l’ESB --> <jee:jndi-lookup id="jmsConnectionFactory" jndi-name="IndexoEventCF"> <jee:environment> java.naming.factory.initial=xxx java.naming.provider.url=yyy </jee:environment> </jee:jndi-lookup> <task:executor id="businessChangeTaskExecutor" pool-size="10-40"/> <task:executor id="errorTaskExecutor"/> <!-- Unmarshaller JAXB 2 de la partie métier de la notification --> <oxm:jaxb2-marshaller id="businessEventUnmarshaller" contextPath="com.javaetmoi.indexo.model.event.business.v1"/> 12 Définition des beans d’Infrastructure Accès à l’annuaire JNDI distant de l’ESB Pools de threads dédiés à la gestion des erreurs et aux traitements de chaque objet métier à indexer Implémentation avec Spring Intégration
  • 13. Implémentation avec Spring Intégration • Utilisation du pattern Channel Adapter • Connecte un channel avec des systèmes ou des services de transports externes • 2 types de Channel Addapter : Inbound ou Outbound • Uni-directionnel • Implémentation retenue dans Spring Integration : – Adapteur JMS entrant de type Message Driven <int-jms:message-driven-channel-adapter destination="EventQueue" channel="jmsEventChanel" /> <int:channel id="jmsEventChanel" /> 13 Etape 1 : Lecture de la notification à partir de la file JMS Nom de la file JMS en entrée d’Index Channel dans lequel le GenericMessage est déposé
  • 14. Implémentation avec Spring Intégration • Utilisation du pattern Message Filter • Décide de faire passer ou non un message vers le output channel • Par défaut : un message filtré est ignoré • Autre configuration possible : levée d’une exception ou message routé dans un discard-channel • Implémentation retenue dans Spring Integration : – Filtre XML par expression XPath <int-xml:xpath-filter input-channel="jmsEvenChannel" output-channel="indexoEventChannel" discard-channel="unexpectedEventChannel"> <int-xml:xpath-expression expression= "/Notification/Header/Type = 'BODC'"/> </int-xml:xpath-filter> 14 Etape 2 : Filtrage à partir du cartouche technique Notification de type BODC dédiée à Indexo Notifications invalides routées dans un channel
  • 15. Implémentation avec Spring Intégration • Patterns Publish-Subscribe, Content Enricher et Channel Adapter – Génération d’un log d’erreur et envoi d’un email en simultanés <publish-subscribe-channel id="unknownEventChannel" task-executor="errorTaskExecutor"/> <logging-channel-adapter channel="unknownEventChannel" level="ERROR" expression=« 'Unknown message: ' + payload.failedMesssage.payload"/> <chain input-channel="unknownEventChannel"/> <int-mail:header-enricher> <int-mail:subject value="Unknown message"/> <int-mail:to value="support@javaetmoi.com"/> </int-mail:header-enricher> <int-mail:outbound-channel-adapter host="mailserver" port="1021"/> </chain> 15 Etape 3 : Traitement des erreurs Non Bloquant Abonnés appelés en parallèle Ajoute les en- têtes mail_subject et mail_to
  • 16. Implémentation avec Spring Intégration • Pattern de transformation de messages – Seule la partie métier est nécessaire à l’indexation – Utilisation du unmarshaller XML JAXB 2 proposé par Spring OXM • Implémentation basée sur le support XML de Spring Intégration <chain input-channel="indexoEventChannel" output-channel="businessEventChannel"/> <int-xml:xpath-transformer xpath-expression="/Notification/Body" evaluation-type="NODE_RESULT" /> <int-xml:unmarshalling-transformer unmarshaller="businessEventUnmarshaller"/> </chain> 16 Etape 4 : Extraction puis unmarshalling de la partie métier
  • 17. Implémentation avec Spring Intégration • Utilisation du pattern Message Splitter • Découpe un message en plusieurs messages. • Permet de segmenter le traitement d’un payload « composite » avec possibilité de regroupement • Implémentation avec chaque sous-message traité en parallèle : public class BusinessDomainEventSplitter { List<BusinessDomainChange> split(BusinessDomainEvent event) { return event.getChanges(); } } <context:bean id="businessDomainEventSplitter" class="com...BusinessDomainEventSplitter"/> <splitter input-channel="businessEventChannel" output-channel="businessChangeChannel" ref="businessDomainEventSplitter"/> <channel id="businessChangeChannel"> <dispatcher task-executor="businessChangeTaskExecutor"/> </channel> 17 Etape 5 : Séparation en informations de mise à jour unitaire
  • 18. Implémentation avec Spring Intégration • Utilisation du pattern Message Router • Décide dynamiquement vers quel(s) channel(s) un message doit être envoyé • La décision est généralement fonction des en-têtes ou du contenu • Implémentation à l’aide d’une Spring Expression Language (SpEL) : <recipient-list-router input-channel="businessChangeChannel"> <recipient channel="objetUpdateChannel" selector-expression="payload.action.equals(UPDATE)"/> <recipient channel="objetDeleteChannel" selector-expression="payload.action.equals(DELETE)"/> </recipient-list-router> • Configuration simplifiée : <router input-channel="businessChangeChannel" expression="'object' + payload.action + 'channel'" /> 18 Etape 6 : Routage en fonction de l’action
  • 19. Implémentation avec Spring Intégration • Utilisation une 2nde fois du pattern Message Router • Exemple de configuration par annotations : <context:component-scan base-package="com.javaetmoi.indexo.endpoint"/> @MessageEndpoint public class ModificationObjetMetierRouter { @Router(inputChannel="objetUpdateChannel") public String route(BusinessDomainChange payload) { return payload.getObjetTypeCode() +"UpdateChannel"; } } 19 Etape 7 : Routage en fonction du type d’objet métier Nom de l’OuputChannel dans le cas d’une mise à jour d’un produit : « productUpdateChannel » Auto-détection des beans Spring par analyse de package java
  • 20. Implémentation avec Spring Intégration • Utilisation du pattern Gateway • Masque l’API de messaging de Spring Integration • Une Outbound Gateway fait appel à un système externe et renvoie la réponse dans l’application (sous forme de Message) • Une Inbound Gateway fait rentrer des messages dans l’application et attend la réponse • Implémentation à l’aide du support Web Services de SI : – Fait appel au WS SOAP Produx de consultation d’un produit <int-ws:outbound-gateway request-channel="productUpdateChannel" reply-channel="productDtoChannel" destination-provider="wsProductClient" marshaller="productMarshaller" unmarshaller="productUnmarshaller"/> 20 Etape 8 : Récupération des données Poduits à indexer Marshalling manuel via JDOM : l’identifiant du produit est utilisé comme paramètre d’appel du WS Le produit retourné par le WS est unmarshallé dans un ProductDto via JAXB2
  • 21. Implémentation avec Spring Intégration • Utilisation du pattern Service Activator • Endpoint générique connectant un service métier au système de messagerie de SI • L’opération d’un service est invoquée pour traiter le message reçu sur l’input-channel • La réponse est encapsulée dans un message émis sur le output-channel ou le replyChannel @Service("productProcessorService") public class ProcessorServiceImpl implements ProductProcessorService { @Override public ProductDocument process( DtoProduct product) { … } } <service-activator input-channel="productDtoChannel" output-channel="productDocumentChannel" ref="productProcessorService" method="process"/> 21 Etape 9 : Construction du document Lucene à indexer Transforme les données produits en un document indexable par Elasticsearch
  • 22. Implémentation avec Spring Intégration • Nouvelle utilisation du pattern Service Activator @Service("productIndexWriterService") public class ProductIndexWriterImpl implements ProductIndexWriter { @Autowired private Client esClient; public void write(ProductDocument item) { IndexRequestBuilder req = esClient .prepareIndex(« indexo","product", item.getId()); req.setSource(ESContentBuilder.buildContent(item)); esClient.index(req); } } <service-activator input-channel="productDtoChannel" ref="productIndexWriterService" method="write"/> 22 Etape 10 : Ecriture du document Dans Elasticsearch
  • 23. Conclusion • Plaisant malgré une phase d’apprentissage non négligeable • Jeu de lego à l’aide de nombreuses briques • Utilisation sur étagère • Couplage Lâche facilitant les tests et la réutilisabilité • Service métier réutilisé dans les batchs d’indexation • Facilite la mise en place de modèles d’échanges asynchrones orientés messages au sein d’une application basée sur Spring • Simple paramétrage des channels • Séparation des préoccupations entre la logique métier et la logique d’intégration • Spring Intégration Fourni la plomberie et des extensions pour les connectivités 23 Bilan de l’étude de cas
  • 24. Conclusion • Polling de channels passifs – Cadencement des traitements • Failover et load-balancing – Répartition de la charge induite par le traitement des messages et mode dégradé • Bridge – Connecte 2 channels • Intercepteurs – Positionnés globalement ou sur chaque channel, pattern wire-tap • Gestion des transactions – Propagation du contexte transactionnel • Message Store – Persistance JMS ou base de données • API de Construction des messages – API fluent de construction de messages et de leurs en-têtes 24 Pour aller plus loin (1/2)
  • 25. • Site et Manuel de référence de Spring Intégration • http://www.springsource.org/spring-integration • 331 pages, concepts, description détaillée, exemples complets • Site de référence dess EIPS : http://www.enterpriseintegrationpatterns.com • Livres sur Spring Intégration • Just Spring Integration • Spring Integration in action • Pro Spring Integration • Code source sur Github • Spring Tool Suite (STS) • Modélisation Graphique Conclusion 25 Pour aller plus loin (2/2)

Editor's Notes

  1. Découplage Spatial : les systèmes peuvent être distants ou non Temporel : réponse non immédiatement attendue, interaction asynchrone, unidirectionnel ou bidirectionnel Logique : l’émetteur n’a pas besoin de connaître le destinataire
  2. Publié en 2003 => les concepts sont vieux (années 70) Message : immuable, identifiant unique, Analogie avec les messages JMS et SOAP ou les requêtes HTTP En-têtes standardisées : durée de validité, adresse de retour, identifiant de corrélation Channel : le canal où transitent tous les messages. Endpoints : connecteurs, passif ou actifs (polling)
  3. La version RC1 de Spring Integration est sortie fin 2008 Autres prohets : Spring Security, Spring Batch, Spring WS API : <> conteneur / serveur, utilisable n’importe où : main(), web app, batch, swing … Assimilable à un mini ESB Extensions : projet Spring Integration Extension sur GitHub
  4. 1. Lecture de la notification à partir de la file JMS : l’ESB a préalablement validé le cartouche technique
  5. Configuration possible à l’aide d’un DSL Groovy , Scala ou Java
  6. Drivers du provider JMS à inclure dans le classpath
  7. The result type expected from the XPath evaluation. This will be the type of the header value. The following values are allowed: BOOLEAN_RESULT, STRING_RESULT, NUMBER_RESULT, NODE_RESULT and NODE_LIST_RESULT. Defaults internally to XPathEvaluationType.STRING_RESULT if not set. Optional.
  8. Classe BusinessDomainEventSplitter : aucune d’adhérence avec Spring Intégration (annotations, interfaces), simple POJO
  9. Gateway : fait office de proxy
  10. Retour du service facultatif Service métier utilisé par les batchs d’indexation L’attribut method du service-activator est ici facultatif
  11. Un changement de paramétrage peut avoir des effets de bord qu’il faut avoir à l’esprit (ex : parallélisme entrainant la perte du contexte de sécurité et du contexte transactionnel)