Spring Integration est la solution d’intégration proposée par la communauté Spring. Cousin très proche de Mule, Spring Integration vous permet de réduire le code d’infrastructure technique de votre application. En quelques lignes vous pouvez ainsi lire un fichier sur le disque, vérifier chaque ligne puis ensuite enregistrer vers une base les données chargées.
La version 1.0 a été annoncé en décembre dernier, Mark Fisher propose de vous montrer en 10 minutes comment écrire un service simple et faire fonctionner Spring Integration : http://blog.springsource.com/2009/02/13/982/.
Dans son post dont j’ai repris le code ci-dessous, nous déclarons un bean Spring et nous allons montrer comment envoyer un message via Spring Integration.
La configuration Spring importe le namespace de Spring Integration et permet de déclarer le bean Shouter :
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:si="http://www.springframework.org/schema/integration" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-1.0.xsd"> <si:channel id="input"/> <si:channel id="output"> <si:queue capacity="10"/> </si:channel> <si:service-activator input-channel="input" output-channel="output" ref="shouter" method="shout"/> <bean id="shouter" class="blog.Shouter"/> </beans>
Voyons le bean Java qui va recevoir notre message et y ajouter des points d’exclamation:
public class Shouter { public String shout(String s) { return s.toUpperCase().concat("!!!"); } }
Le code Java pour tester le tout est simple :
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("blog/config.xml"); MessageChannel input = (MessageChannel) context.getBean("input"); PollableChannel output = (PollableChannel) context.getBean("output"); input.send(new StringMessage("Le Touilleur Express")); Message< ?> reply = output.receive(); System.out.println("received: " + reply); }
A quoi sert Spring Integration ?
Spring Integration permet de réduire le code technique de votre application. Vous lisez un message sur une queue JMS, vous voulez envoyer un email, vous souhaitez lire un fichier et le convertir vers un autre format, faire un traitement par batch, télécharger via FTP un fichier ou SSH, alors Spring Integration pourra vous intéresser.
Peut-on comparer Spring Integration à Mule ?
Pour qui connaît un peu Mule 2, la ressemblance est frappante. Ross Mason, l’auteur de Mule, a tenté un moment de se rapprocher de la communauté Spring, mais celle-ci a préféré offrir une solution basée exclusivement sur Spring. Il n’y a pas de comparaison possible au sens « l’un est mieux que l’autre ». Mule a cependant un peu plus de recul, dispose de beaucoup plus de connecteurs que Spring Integration pour l’instant. Sa communauté est assez active. Si vous souhaitez utiliser par exemple Tibco Rendezvous ou faire du SSH, il faudra utiliser Mule.
Je pense qu’il est intéressant de connaître les deux projets et de ne pas s’aventurer à faire un choix, s’il faut en faire un.
Est-ce que Spring Integration est un ESB ?
Non, je dirai que c’est un framework léger d’intégration comme Apache Camel, mais pas un ESB. Le produit OpenESB basé sur le serveur d’application Glassfish est un ESB, car il est composé d’une API d’une part et d’un moteur d’autre part. Mule est un ESB léger, il propose son propre moteur ou il peut fonctionner dans une application Web. Spring Integration est par contre une brique peut-être plus facile à mettre en oeuvre si vos besoins sont avant tout techniques.
Pour aller plus loin
Le site de la communauté muleForge : http://www.muleforge.org/
Le site de Mule 2 : http://www.mulesource.org
Article de Cyrille Le Clerc sur le blog de Xebia en 2007
Article de Sébastien Letélié d’Improve sur les ESB : Java Camp II DB and ESB
En complément du billet de Cyrille, une entrée un peu plus récent sur le blog de Xebia :
http://blog.xebia.fr/2008/07/30/introduction-a-spring-integration/.
Tiens, j’avais moi aussi vu cet article et regardé un peu.
Après avoir essayé l’exemple de l’article de Mark Fisher, j’ai voulu essayer quelque chose de plus poussé. J’ai pensé à ton poc mule qui prend du csv dans un répertoire est insère dans une table.
Rapidement quelque constatations :
– Ah bah pas de connecteur jdbc ou j’ai pas trouvé ? Si c’est vraiment pas là, c’est assez dommage bien que ça devrait se bricoler maison.
– Les transformers ne déroutent un peu : on les place entre 2 channels. Ce qui ne me semble pas vraiment faire de grosse différence avec un service-activator et de plus, ça me donne l’impression d’utiliser des channels pour « pas grand chose ». Sur ce point, je trouve l’approche Mule plus intéressante.
je n’ai encore regardé ce qu’il en est du coté des Filter, Router et les autres possibilités qu’offre spring integration.
Malgré tout ça, je trouve ça assez sympa à utiliser pour de petites applications où les traitement restent assez simples.
La définition d’un ESB est complexe (voir mon billet sur le sujet : http://java-soa.blogspot.com/2009/02/les-esb-sont-distribues-par-definition.html). De mon point de vue, l’ensemble des produits dits ESB (OpenESB , Mule, ServiceMix….) ou encore les frameworks comme Spring Integration ou Camel sont très proches dans leur philosophie et permettent de mettre en place une véritable solution d’intégration distribuée qui est l’essence même des ESB.
Je ne suis pas totalement d’accord avec toi quand tu dis qu’OpenESB est le seul véritable ESB. Un ESB pour moi doit être avant tout léger, ce qui n’est pas le cas d’OpenESB qui est aujourd’hui un très bon moteur BPEL avant d’être un conteneur de services facilement déployable . L’un des avantages d’OpenESB est sa grande collection de composants mais il me semble trop lourd (en attente de la release Fuji qui me semble sur la bonne voie) comparé à ServiceMix ou Mule.
Greg
PS : je profite de mon premier commentaire pour te remercier pour l’ensemble de ton oeuvre 😉 le contenu de tes posts est toujours très intéressant, utile et enrichissant…