<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le Touilleur Express &#187; mule</title>
	<atom:link href="http://www.touilleur-express.fr/tag/mule/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touilleur-express.fr</link>
	<description>Blog sur Java, le métier de développeur et la vie de freelance par Nicolas Martignole</description>
	<lastBuildDate>Wed, 08 Feb 2012 11:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Introduction à Spring Integration</title>
		<link>http://www.touilleur-express.fr/2009/02/19/spring/</link>
		<comments>http://www.touilleur-express.fr/2009/02/19/spring/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 22:04:34 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[mule]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=783</guid>
		<description><![CDATA[Spring Integration est la solution d&#8217;intégration proposée par la communauté Spring. Cousin très proche de Mule, Spring Integration vous permet de réduire le code d&#8217;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&#8217;ai repris le code ci-dessous, ...]]></description>
			<content:encoded><![CDATA[<p>Spring Integration est la solution d&#8217;intégration proposée par la communauté Spring. Cousin très proche de Mule, Spring Integration vous permet de réduire le code d&#8217;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.</p>
<p>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 : <a href="http://blog.springsource.com/2009/02/13/982/">http://blog.springsource.com/2009/02/13/982/</a>.</p>
<p>Dans son post dont j&#8217;ai repris le code ci-dessous, nous déclarons un bean Spring et nous allons montrer comment envoyer un message via Spring Integration.</p>
<p>La configuration Spring importe le namespace de Spring Integration et permet de déclarer le bean Shouter :<br />
 </p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;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"&gt;

&lt;si:channel id="input"/&gt;

&lt;si:channel id="output"&gt;
&lt;si:queue capacity="10"/&gt;
&lt;/si:channel&gt;

&lt;si:service-activator input-channel="input" output-channel="output" ref="shouter" method="shout"/&gt;

&lt;bean id="shouter" class="blog.Shouter"/&gt;

&lt;/beans&gt;
</pre>
<p>Voyons le bean Java qui va recevoir notre message et y ajouter des points d&#8217;exclamation:</p>
<pre class="java">public class Shouter {
    public String shout(String s) {
        return s.toUpperCase().concat("!!!");
    }
}</pre>
<p>Le code Java pour tester le tout est simple :</p>
<pre class="java">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&lt; ?&gt; reply = output.receive();

    System.out.println("received: " + reply);
}</pre>
<p><strong>A quoi sert Spring Integration ?</strong><br />
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.</p>
<p><strong>Peut-on comparer Spring Integration à Mule ?</strong><br />
Pour qui connaît un peu <a href="http://www.mulesource.org/display/MULE/Home">Mule 2</a>, la ressemblance est frappante. Ross Mason, l&#8217;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&#8217;y a pas de comparaison possible au sens &laquo;&nbsp;l&#8217;un est mieux que l&#8217;autre&nbsp;&raquo;. Mule a cependant un peu plus de recul, <a href="http://www.muleforge.org/">dispose de beaucoup plus de connecteurs</a> que Spring Integration pour l&#8217;instant. Sa communauté est assez active. Si vous souhaitez utiliser par exemple Tibco Rendezvous ou faire du SSH, il faudra utiliser Mule.<br />
Je pense qu&#8217;il est intéressant de connaître les deux projets et de ne pas s&#8217;aventurer à faire un choix, s&#8217;il faut en faire un.</p>
<p><strong>Est-ce que Spring Integration est un ESB ?</strong><br />
Non, je dirai que c&#8217;est un framework léger d&#8217;intégration comme Apache Camel, mais pas un ESB. Le produit OpenESB basé sur le serveur d&#8217;application Glassfish est un ESB, car il est composé d&#8217;une API d&#8217;une part et d&#8217;un moteur d&#8217;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.</p>
<p><strong>Pour aller plus loin</strong><br />
Le site de la communauté muleForge : <a href="http://www.muleforge.org/">http://www.muleforge.org/</a><br />
Le site de Mule 2 : <a href="http://www.mulesource.org">http://www.mulesource.org</a><br />
<a href="http://blog.xebia.fr/2007/12/17/spring-integration-lavenement-des-lightweight-esb/">Article de Cyrille Le Clerc</a> sur le blog de Xebia en 2007<br />
Article de Sébastien Letélié d&#8217;Improve sur les ESB : <a href="http://www.itaware.eu/tag/spring-integration/">Java Camp II DB and ESB</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/02/19/spring/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Devoxx : ESB in Financial Application</title>
		<link>http://www.touilleur-express.fr/2008/12/27/devoxx-esb-in-financial-application/</link>
		<comments>http://www.touilleur-express.fr/2008/12/27/devoxx-esb-in-financial-application/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 23:00:26 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[mule]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=635</guid>
		<description><![CDATA[Cette année j&#8217;ai eu l&#8217;occasion de présenter un sujet sous la forme d&#8217;un Quickie à Devoxx. Il s&#8217;agit d&#8217;une mini-présentation limitée à 15 minutes, à l&#8217;heure du déjeuner. Au final j&#8217;ai bien aimé cette première expérience, en anglais et devant pas mal de monde mine de rien. Voici la présentation en français.
1. ESB in Financial Application

2. Objectif de la présentation

En quinze minutes, l&#8217;idée de cette présentation est d&#8217;expliquer les besoins rencontrés dans le monde de la finance en terme d&#8217;architecture. Où en sommes-nous aujourd&#8217;hui et quels outils pouvons-nous utiliser afin ...]]></description>
			<content:encoded><![CDATA[<p>Cette année j&#8217;ai eu l&#8217;occasion de présenter un sujet sous la forme d&#8217;un Quickie à <a href="http://www.devoxx.com">Devoxx</a>. Il s&#8217;agit d&#8217;une mini-présentation limitée à 15 minutes, à l&#8217;heure du déjeuner. Au final j&#8217;ai bien aimé cette première expérience, en anglais et devant pas mal de monde mine de rien. Voici la présentation en français.</p>
<p><strong>1. ESB in Financial Application</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.001-001.png"/></p>
<p><strong>2. Objectif de la présentation</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.003-001.png"/><br />
En quinze minutes, l&#8217;idée de cette présentation est d&#8217;expliquer les besoins rencontrés dans le monde de la finance en terme d&#8217;architecture. Où en sommes-nous aujourd&#8217;hui et quels outils pouvons-nous utiliser afin de réduire les coûts et améliorer nos architectures ?</p>
<p><strong>3. Speaker&#8217;s Qualifications</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.004-001.png"/><br />
Après 5 ans 1/2 chez Reuters, j&#8217;ai débuté une nouvelle activité en tant qu&#8217;indépendant. Je travaille actuellement chez BNP-Paribas sur une mission d&#8217;architecture. Je suis membre du Paris Java User Group.</p>
<p><strong>4. ESB</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.005-001.png"/><br />
ESB. Ce mot est à la mode. A Devoxx j&#8217;ai compté 4 conférences cette année. Mule est traité 3 fois par Antoine Borg avec qui j&#8217;ai eu le plaisir de discuter la veille, bref il se passe quelque chose. A noter qu&#8217;aucune conférence ne nous parle de téléphone portable, les thèmes cette année tournent autour de l&#8217;intégration, de la sécurité ou de SOA. Voyons un peu &laquo;&nbsp;dans la vraie vie&nbsp;&raquo; où nous en sommes aujourd&#8217;hui, car moi, plutôt que de parler de SOA ou d&#8217;ESB, j&#8217;aime bien parler du terrain avant tout.</p>
<p><strong>5. A legacy application</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.006-001.png"/><br />
Ce que l&#8217;on constate c&#8217;est que les applications vieillissantes dans le monde Java des applications de gestion et de la finance, se présentent avec un socle d&#8217;architecture bien connu. Autour d&#8217;une architecture trois-tiers, nous retrouvons souvent du Struts pour la partie Web, un serveur d&#8217;application avec encore beaucoup d&#8217;EJB 2.1, et les innovations des dernières années que sont Hibernate, Spring et JMS. Et il est clair que ce type d&#8217;architecture aujourd&#8217;hui en production est encore amené à perdurer pour quelques années.<br />
Votre travail sera donc de faire vivre, d&#8217;améliorer ou de transformer ce type d&#8217;architecture.</p>
<p><strong>6. A legacy application (cont.)</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.006-004.png"/><br />
Dans la finance, une application web communique et échange des ressources avec le monde extérieur en utilisant un certain nombre de connecteurs techniques (boîtes vertes). Ce code est bien souvent du code développé au fur et à mesure des besoins. Il peut s&#8217;agir de lire un fichier, d&#8217;échanger via JMS avec une autre application, de faire appel à un web service, ou d&#8217;envoyer un email. Bref, du code massivement technique. Ce code est le socle de communication de chaque application de gestion.</p>
<p><strong>7. Connect</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.007-001.png"/><br />
Connecter.<br />
Le besoin de Connecter différents systèmes. Ce besoin entraine un travail de médiation, de transformation et d&#8217;interconnexion entre systèmes. Je veux montrer ici qu&#8217;il y a forcément un besoin de connexion, au minimum avec une base de données relationnelles, mais bien souvent avec d&#8217;autres systèmes informatiques ou techniques. C&#8217;est une composante fondamentale de nos solutions, de ce que nous sommes appelés à développer.</p>
<p><strong>8. Ecosystem</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.008-001.png"/><br />
J&#8217;ai représenté sur ce slide une application financière typique de création de rapports, utilisé sur une plateforme de Prime Brokerage. Ce que nous voyons tout d&#8217;abord, c&#8217;est que cette application a besoin d&#8217;un environnement pour fonctionner, un écosystème. Cet écosystème est composé d&#8217;un grand nombre d&#8217;applications, maintenu par d&#8217;autres équipes que la mienne.<br />
Mon application est représentée au milieu avec ses 3 services internes.</p>
<p><strong>9. Ecosystem 2</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.008-003.png"/><br />
Cette application utilise les données du marché ainsi qu&#8217;un service de tenue de Position. Aujourd&#8217;hui les échanges entre les systèmes s&#8217;effectuent avec des fichiers plats via des répertoires partagés ou via JMS. Dans le livre Enterprise Integration Pattern, une excellente présentation explique les avantages et les inconvénients de ces 2 types d&#8217;échange.</p>
<p><strong>10. Ecosystem 3</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.008-009.png"/><br />
Au delà des échanges de mon application, ce qui est encore plus intéressant c&#8217;est de constater que les autres applications échangent elles-aussi des informations entre elles. Il faut donc bien voir que nous sommes là face à un vrai réseau de communication, de médiation et d&#8217;échanges. C&#8217;est le coeur d&#8217;une architecture financière.</p>
<p><strong>11. Ecosystem 4</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.008-012.png"/><br />
Au final je dois prendre en compte que mon application cohabite, échange et transfert ses données avec un nombre assez important d&#8217;applications. Je ne rentre pas dans les détails de la partie métier, car l&#8217;idée ici n&#8217;est pas de vous donner un cours de finance des marchés, simplement d&#8217;expliquer que les systèmes sont massivement connectés en un réseau.</p>
<p><strong>12. Ecosystem 5</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.008-013.png"/><br />
&#8230; En forçant un peu le trait, je peux faire une analogie avec un réseau social comme FaceBook : mon application fait partie d&#8217;un réseau, d&#8217;autres applications m&#8217;envoient des messages, observent même les données que je produis sans que je ne le sache, il y a donc clairement un besoin important à résoudre : ce besoin de communication et d&#8217;échanges avec mes &laquo;&nbsp;amis&nbsp;&raquo;.</p>
<p><strong>13. Collaborate</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.009-001.png"/><br />
Collaborate en anglais, difficile à traduire avec le même sens en français.<br />
Collaborer c&#8217;est apprendre à se connaître : lorsque mon application échange avec d&#8217;autres systèmes financiers, au delà du problème technique à résoudre il y aura une interaction humaine. Et donc, ESB ou non, SOA ou non, ce projet d&#8217;inter-communication doit s&#8217;accompagner de la définition d&#8217;une langue pour se comprendre, d&#8217;un média pour discuter et d&#8217;un contenu pour s&#8217;entendre.<br />
Revenons un peu à notre application financière type pour parler d&#8217;un facteur très important : le temps.</p>
<p><strong>14. Timebox and Adaptive</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.010-001.png"/><br />
J&#8217;ai sélectionné ces deux photos du métro afin d&#8217;illustrer un facteur important dans les applications financières : l&#8217;importance de l&#8217;heure de la journée. Prenons le métro de Paris : le matin entre 07h00 et 09h00 il y a un métro chaque minute. A 14h il y a un métro toutes les 6 minutes. A 23h00 il y a une rame toutes les 15 minutes.<br />
Le nombre de rame de métro par heure s&#8217;adapte selon les heures d&#8217;affluence.<br />
Qu&#8217;en est-il de mon application financière ?<br />
Chaque matin celle-ci a besoin de 10 fois plus de puissance qu&#8217;en pleine journée, car la génération des rapports doit s&#8217;effectuer à la fermeture du marché boursier, dans un intervalle de temps limité. Il n&#8217;est pas possible de lancer la génération tant que le marché est ouvert. D&#8217;autre part celle-ci doit s&#8217;effectuer avant l&#8217;ouverture du marché suivant, en Asie. De fait, nous nous retrouvons avec une architecture qui doit répondre à des demandes fluctuantes selon l&#8217;heure de la journée.<br />
Mais le plus important est que notre application n&#8217;a pas le droit à une deuxième chance. Lorsqu&#8217;un bug survient, il faut que l&#8217;erreur soit corrigée avant l&#8217;ouverture du marché, et ce phénomène n&#8217;est pas contrôlable.<br />
Enfin on constate que passé les quelques heures d&#8217;activité, la plateforme est ensuite peu sollicité en cours de journée.<br />
Or le souci, c&#8217;est qu&#8217;aujourd&#8217;hui mon architecture n&#8217;est pas écologique : 16 serveurs de calcul de risk tournent en permanence, 4 serveurs d&#8217;applications sont sollicités pendant la journée mais l&#8217;utilisation des ressources est assez inégale durant la journée.<br />
Il faut donc retenir que dans la finance, l&#8217;utilisation des ressources et la quantité des échanges avec les autres systèmes varient au cours de la journée. Cependant nous savons à l&#8217;avance nos besoins, et donc idéalement notre système devrait pouvoir s&#8217;adapter et se programmer comme le réseau de transport parisien.<br />
Un site internet qui vend des ordinateurs pourrait être surpris de l&#8217;affluence de visiteur. Pas une application financière : il est possible de connaître à l&#8217;avance les besoins en énergie. Mais pourtant, il est difficile aujourd&#8217;hui de régler et d&#8217;adapter cette énergie.</p>
<p><strong>15. Crisis</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.011-003.png"/><br />
2008 marque le début d&#8217;une crise financière, qui aura un impact dès demain sur les budgets des projets dans le monde de la banque et de la finance. Nos besoins de connexions avec les autres applications financières demeurent. Je pense même qu&#8217;il y aura de nouvelles réglementations pour éviter certains dérapages de 2008. Vu la nervosité des marchés financiers, les calculs de VaR, de risque, d&#8217;appel de marge, de collatéral sur notre application de Prime Brokerage vont aussi certainement être plus intensif&#8230; Bref il va y avoir du sport en 2009.</p>
<p><strong>16. Predictions for 2009</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.012-001.png"/><br />
ll est donc facile d&#8217;imaginer ce qui nous attend : avec moins de budget, moins de liberté et plus de pressions, il va falloir trouver des solutions rapides, économiques et capables de faire réaliser des économies. Pour ma part, un calcul de risque c&#8217;est un appel de marge pour un client. Si la plate-forme sur laquelle je travaille peut traiter 50 000 calculs au lieu de 10 000 car mon architecture évolue, alors je ferai gagner de l&#8217;argent à mon client.<br />
D&#8217;autre part, vu la morosité et la crise du secteur de la finance, je pense que les solutions pragmatiques seront les gagnantes de 2009. J&#8217;ai peur que de gros projets basés sur les ESB des constructeurs souffrent du même phénomène que les constructeurs automobiles. Les gens veulent une voiture ? ils achètent une Logan et pas le dernier 4&#215;4 à la mode.<br />
Votre application a besoin d&#8217;un ESB ? Peut-être que Spring Integration, Mule ou Apache ServiceMix seront suffisants pour vos besoins, que les gros projets sur 6 mois auront plus de mal en 2009 à être validé par les DSI. Il est temps d&#8217;être pragmatique et d&#8217;arrêter de rêver sur des besoins que les grands éditeurs d&#8217;ESB nous ont peut-être inventé, comme les éditeurs de serveur d&#8217;app en 2000&#8230; Etre pragmatique, économe, écologique, réaliste.</p>
<p><strong>17. Toolbox</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.013-001.png"/><br />
En 2009 je pense que vous lirez des articles, que vous testerez, que vous entendrez parler de ces produits : Mule, Apache Service Mix, Apache Camel, Spring Integration, OpenESB project Fuji, Apache Synapse, Apache CXF, Jboss ESB&#8230; car ce sont des solutions qui répondent à un besoin : l&#8217;intégration légère en entreprise.<br />
Après la guerre des serveurs d&#8217;application il y a quelques années, je pense que la prochaine grande bataille sera sur ce front. Les éditeurs du monde open-source savent que la demande va exploser, car lorsque la crise est là comme en 2001, le monde open-source tire son épingle du jeu. En 2002 personne ne se souvient mais c&#8217;était la grande époque des articles sur Linux dans 01 informatique, le Monde informatique ect. L&#8217;administration français a alors fait un grand pas en sélectionnant des solutions comme JBoss Application Server pour traiter&#8230; nos déclarations de revenus.<br />
Economies, pragmatismes, simplifications, réductions des coûts&#8230;</p>
<p><strong>18. A New Approach</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.014-001.png"/><br />
Alors si nous  repensons à notre application de gestion du début, voici comment je la vois en 2009. Tout d&#8217;abord le Web tiers a été déporté de mon architecture. Je ne fais pas une application Web, je fais d&#8217;abord l&#8217;architecture d&#8217;une application de gestion. Le web ne me coûte pas cher, j&#8217;utilise des frameworks légers sur une recopie en lecture seule de ma base de données. Seule une petite partie du code métier est partagée avec mon espace de données principal.<br />
Ensuite on voit que j&#8217;ai cassé ce gros rectangle : je pense que des services sans états et légers sont suffisants pour effectuer les traitements de mon application. Là où auparavant j&#8217;utilisais la base de données pour stocker des données de travail, j&#8217;utilise désormais un espace mémoire en cluster afin de répliquer les données nécessaires à mes traitements de calculs. Cela demande plus de mémoire physique mais quintuple les performances de traitements. La base de données relationnelle n&#8217;intervient que via un service d&#8217;historisation qui effectue des captures de données afin de sauvegarder les données les plus sensibles, essentiellement pour un problème légal. Notez que la base est un petit carré bleu, car finalement elle ne me sert plus à grand chose.<br />
Ces services reprennent la boîte à outil dont nous avons parlé tout à l&#8217;heure. Plutôt que de chercher à faire une grosse boite qui fait tout (un ESB au sens de certains) je crée un ensemble de services qui discutent et s&#8217;échangent des données. Et plutôt que de tenter de résoudre les problèmes de communication avec les applications extérieurs, de tenter de mettre en place un gros chantier afin de mettre tout le monde sur la même plateforme, je conserve et respecte les systèmes extérieurs, je m&#8217;adapte à eux, eux ne s&#8217;adaptent pas à moi. Et là je sais que mon application pour 2009 pourra continuer à exister sans couter une fortune.<br />
Il faut donc oublier ce rêve qui serait de migrer toutes les applications de mon réseau vers un seul et même système. Ce serait un risque si l&#8217;éditeur disparaît (ce qui n&#8217;est pas exclu en ce moment). Ce serait la plus belle décision pour dégrader massivement les performances : pourquoi un système extérieure serait plus rapide que ce que mes équipes ont développé ? Ce serait un risque technique, un risque en terme de sécurité, et finalement, il faudrait attendre 6 mois avant de voir ce type de projet de gouvernance sur les rails.</p>
<p>Pour revenir à l&#8217;image du métro parisien, je rêve aussi de louer de la puissance machine plutôt que de l&#8217;acheter en utilisant par exemple Amazon EC2 et une solution comme Elastic Grid pour piloter mon parc informatique. Pour cette raison mon nouveau système est découpé en services sans état afin de faciliter une migration partielle et rapide de certains services vers ces nouvelles plate-formes de calculs et d&#8217;hébergement. La première banque qui aura déployé une plateforme de calcul de risque hostée comme un service sur internet gagnera certainement beaucoup d&#8217;argent.<br />
Economies, pragmatismes, simples, réduire les coûts, arrêter de croire au père noël, pensez sur 6 mois&#8230;</p>
<p><strong>Code code code</strong><br />
Ensuite j&#8217;ai un slide technique pour montrer un exemple d&#8217;utilisation d&#8217;Apache Camel. Lors de la conférence je n&#8217;ai pas eu assez de temps pour les présenter. Je vous ferrai un article complet sur Camel prochainement, donc revenez en janvier pour voir la suite.<br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.015-001.png"/></p>
<p><strong>Keep it simple</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.016-001.png"/><br />
Pour connecter plusieurs systèmes il est tentant de faire n&#8217;importe quoi, de faire au plus vite ou de chercher une solution chère et trop complexe pour un problème. Soyez simple et vous réussirez à développer une architecture qui fonctionne.</p>
<p><strong>Ne pas faire de l&#8217;intégration pour en faire&#8230;</strong><br />
Comme ces messieurs dans la piscine : ne cherchez pas à faire de l&#8217;ESB pour en faire, et faites attention à votre environnement. Un ESB ne remplace pas une réunion de pilotage avec l&#8217;autre équipe en face qui fait &laquo;&nbsp;l&#8217;autre&nbsp;&raquo; produit.<br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.017-001.png"/></p>
<p><strong>Don&#8217;t buy a solution</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.018-001.png"/><br />
N&#8217;achetez pas les yeux fermés une solution. Au contraire, il faut que vos équipes retroussent leurs manches, repensez à des solutions simples. Dans le monde des applications de gestion, et de la Finance, le temps est certes à l&#8217;économie, mais aussi à un pragmatisme souvent contraire à nos envies d&#8217;architectes et de consultants.</p>
<p><strong>The End</strong><br />
<img src="http://www.touilleur-express.fr/devoxx/02Devoxx2008_quickie_D8_Q_11_04_01_NMartignole.020-001.png"/><br />
En conclusion : nous avons discuté des besoins en architecture dans le monde de la finance : connecter, échanger et collaborer, inter-agir avec d&#8217;autres systèmes. Les solutions d&#8217;intégrations légères seront en 2009 un moyen de réduire les coûts en évitant d&#8217;écrire à la main du code technique sans valeur ajoutée. Je souhaite dépiler un message JMS et envoyer un email, Mule m&#8217;aide à le faire en quelques heures au lieu de perdre mon temps avec du code sans valeur. Face aux réductions de budgets, il est logique de penser que les solutions d&#8217;intégration dans la finance auront le vent en poupe en 2009. Et face à cette crise, il y aura encore plus de travail pour nous, avec encore moins de budgets, d&#8217;où la nécessité de s&#8217;outiller enfin correctement.</p>
<p>Fin de la présentation<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/12/27/devoxx-esb-in-financial-application/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Exemple Mule : lire un fichier CSV et écrire vers une base de données</title>
		<link>http://www.touilleur-express.fr/2008/12/23/exemple-mule-lire-un-fichier-csv-et-ecrire-vers-une-base-de-donnees/</link>
		<comments>http://www.touilleur-express.fr/2008/12/23/exemple-mule-lire-un-fichier-csv-et-ecrire-vers-une-base-de-donnees/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 20:10:32 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[mule]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=628</guid>
		<description><![CDATA[Mule est un outil léger d&#8217;intégration qui permet de connecter différents systèmes. Par rapport à d&#8217;autres ESB plus complexes, Mule est un système rapide à mettre en place pour répondre par exemple aux cas d&#8217;usage suivants : lire un fichier CSV et l&#8217;importer vers une base de données. rerouter un appel d&#8217;un web service vers un envoi d&#8217;email, lire des fichiers plats puis les envoyer via FTP, lire le contenu d&#8217;une page via HTTP pour ensuite envoyer un email&#8230; Comme on le voit, Mule est donc avant tout un système ...]]></description>
			<content:encoded><![CDATA[<p>Mule est un outil léger d&#8217;intégration qui permet de connecter différents systèmes. Par rapport à d&#8217;autres ESB plus complexes, Mule est un système rapide à mettre en place pour répondre par exemple aux cas d&#8217;usage suivants : lire un fichier CSV et l&#8217;importer vers une base de données. rerouter un appel d&#8217;un web service vers un envoi d&#8217;email, lire des fichiers plats puis les envoyer via FTP, lire le contenu d&#8217;une page via HTTP pour ensuite envoyer un email&#8230; Comme on le voit, Mule est donc avant tout un système d&#8217;interconnexion simple et conçu pour faciliter l&#8217;intégration de données dans une application Java.</p>
<p>La version Entreprise de Mule propose un exemple complet d&#8217;utilisation du connecteur JDBC. Le code source de cet exemple n&#8217;étant pas distribuable ni libre de droits, je vous propose dans cet article un exemple simple dans lequel je vais lire un fichier texte de type CSV, le transformer puis ensuite l&#8217;importer dans une base HSQLDB.</p>
<p>Cet exemple vous montre comment écrire un transformer, déclarer le connecteur JDBC de Mule puis enfin mette en oeuvre le tout.</p>
<h2>Installation de Mule</h2>
<p>Téléchargez la version de Mule 2.1.2 via <a href="http://www.mulesource.org/display/MULE/Download">le site de Mule</a><br />
Décompressez dans un répertoire l&#8217;archive<br />
Déclarer une variable d&#8217;environnement MULE_HOME<br />
Mettez à jour le script startMule.sh donné avec l&#8217;archive à la fin de cette article pour pointer vers le bon répertoire de Mule.</p>
<h2>Mise en place de la base de données</h2>
<p>Dans un premier temps, si vous souhaitez tester par vous même, téléchargez l&#8217;archive suivante &laquo;&nbsp;mule-poc.tar.gz&nbsp;&raquo;. Je vous ai préparé une arborescence avec l&#8217;ensemble du code source. Le répertoire database contient de quoi créer une base HSQLDB en mémoire mais autonome, car déclarée sous la forme serveur.<br />
HSQLDB nécessite un fichier &laquo;&nbsp;sqltools.rc&nbsp;&raquo; pour que le mode serveur autorise des connexions sur le serveur. Pour cela, copiez le fichier sqltools.rc vers votre répertoire $HOME (ou C:\Document and Settings\<votre uid>)<br />
Le script <i>startDBServer.sh</i> assume que Java 5 ou 6 se trouve dans le Path, et démarre le serveur HSQLDB. N&#8217;étant pas un expert HSQLDB, j&#8217;ai fait au plus simple.<br />
Le script createDatabase.sql sera exécuté via le script shell &laquo;&nbsp;createDatabase.sh&nbsp;&raquo; afin d&#8217;importer le contenu du fichier sample.dsv.</p>
<h2>Structure simple de la base</h2>
<p>L&#8217;unique table de la base est vraiment ce qu&#8217;il y a de plus simple, il n&#8217;y a pas d&#8217;index ni de clé primaire. Simplement des types Date, boolean, int et Varchar afin de montrer les capacités de transtypage de Mule.<br />
<code><br />
CREATE TABLE sampletable(id INT, lastUpdate DATE NOT NULL, msg VARCHAR, isValid BOOLEAN);<br />
</code></p>
<h2>Le fichier de configuration de Mule</h2>
<p>Le fichier de configuration de Mule est le coeur du  système. Basé sur Spring, Mule partage des concepts de Spring 2.5 qui en font un système très facile à apprendre. Contrairement à une solution basée sur Spring Integration, vous verrez qu&#8217;ici je ne vais écrire qu&#8217;une seule classe Java. J&#8217;aimerai refaire le même exemple avec Spring Integration plus tard afin de comparer.</p>
<p>L&#8217;entête du fichier déclare les namespaces des connecteurs file, stdio, vm et jdbc ainsi que les entêtes pour Spring.</p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;mule xmlns="http://www.mulesource.org/schema/mule/core/2.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:spring="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:file="http://www.mulesource.org/schema/mule/file/2.1"
      xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.1"
      xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.1"
      xmlns:jdbc="http://www.mulesource.org/schema/mule/jdbc/2.1"
      xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.mulesource.org/schema/mule/core/2.1 http://www.mulesource.org/schema/mule/core/2.1/mule.xsd
       http://www.mulesource.org/schema/mule/file/2.1 http://www.mulesource.org/schema/mule/file/2.1/mule-file.xsd
       http://www.mulesource.org/schema/mule/vm/2.1 http://www.mulesource.org/schema/mule/vm/2.1/mule-vm.xsd
       http://www.mulesource.org/schema/mule/stdio/2.1 http://www.mulesource.org/schema/mule/stdio/2.1/mule-stdio.xsd
       http://www.mulesource.org/schema/mule/file/2.1 http://www.mulesource.org/schema/mule/file/2.1/mule-file.xsd
       http://www.mulesource.org/schema/mule/jdbc/2.1 http://www.mulesource.org/schema/mule/jdbc/2.1/mule-jdbc.xsd"&gt;
</pre>
<p>Ensuite je déclare simplement un DriverManagerDataSource en utilisant la base HSQLDB démarrée sur mon serveur. Le login par défaut est &#8216;sa&#8217; et il n&#8217;y a pas de mot de passe.</p>
<pre name="code" class="xml">
    &lt;spring:bean id="touilleurDB"
                 class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
        &lt;spring:property name="driverClassName"
                         value="org.hsqldb.jdbcDriver"/&gt;
        &lt;spring:property name="url"
                         value="jdbc:hsqldb:hsql://localhost"/&gt;
        &lt;spring:property name="username" value="sa"/&gt;
        &lt;spring:property name="password" value=""/&gt;
    &lt;/spring:bean&gt;
</pre>
<p>Je déclare ensuite un connecteur mule de type JDBC avec pour datasource-ref, mon bean &laquo;&nbsp;touilleurDB&nbsp;&raquo;.<br />
Dans ce connecteur vous pouvez déclarer 3 types de requêtes, je ne déclare ici qu&#8217;une requête d&#8217;insertion appelée &laquo;&nbsp;writeTest&nbsp;&raquo;. Cette requête va recevoir une List de Map. Chaque élément de la List correspond à une ligne de fichier. Chaque élément de la ligne séparé par des virgules, sera enregistré dans une Map. J&#8217;y reviens plus loin.<br />
La lecture des arguments utilise ici map-payload, l&#8217;une des techniques de Mule pour récupérer des couples clés-valeurs facilement.</p>
<p>Une fois cette requête &laquo;&nbsp;writeTest&nbsp;&raquo; déclarée, elle est alors disponible pour mon service Mule</p>
<pre name="code" class="xml">
    &lt;jdbc:connector name="myJdbcConnector"
                    dataSource-ref="touilleurDB"
                    pollingFrequency="1000"&gt;
        &lt;jdbc:query key="writeTest"
                    value="INSERT INTO SAMPLETABLE (ID, lastUpdate, msg, isValid) VALUES (#[map-payload:id], #[map-payload:lastUpdated], #[map-payload:msg], #[map-payload:isValid])"/&gt;
    &lt;/jdbc:connector&gt;
</pre>
<p>Je déclare ensuite 1 transformer :</p>
<pre name="code" class="xml">

    &lt;custom-transformer name="StringToListOfMap" class="com.innoteria.mule.simple.StringToListOfMap"/&gt;
</pre>
<p>Le code de la classe StringToListOfMap n&#8217;est pas très élégant mais l&#8217;intérêt ici est de vous expliquer le principe, pas de vous donner un cours de Java. Mule lit un fichier texte simple et par défaut transforme son contenu en une String. A noter que ce comportement est bien entendu désactivable mais ici il me rend service car mon transformer reçoit directement une String contenant tout le fichier. Je vais ensuite iterer et créer une Map clé-valeur correspondant aux paramètres de ma requête &laquo;&nbsp;writeTest&nbsp;&raquo; précédemment déclarée.<br />
Enfin je mets chacune de mes Map dans une List pour ensuite utiliser l&#8217;encoding transformer <strong>map-payload</strong></p>
<pre name="code" class="java">
public class StringToListOfMap extends AbstractTransformer {

    @Override
    protected Object doTransform(Object src, String encoding) throws TransformerException {
        String payload = (String) src;

        if (payload == null) return null;
        StringTokenizer stLine = new StringTokenizer(payload, "\n");

        String line;
        Map m;
        List resultList=new ArrayList();
        StringTokenizer st;
        while (stLine.hasMoreTokens()) {
            line=stLine.nextToken();
            st=new StringTokenizer(line,",");
            m = new HashMap();
            m.put("id", st.nextToken());
            m.put("lastUpdated", st.nextToken());
            m.put("msg", st.nextToken());
            m.put("valid", st.nextToken());
            resultList.add(m);

        }
        return resultList;

    }
}
</pre>
<p>Pour terminer la configuration de mon service Mule, je déclare ensuite un connecteur de type <strong>file</strong>. L&#8217;instance de Mule va scruter le répertoire out/source. Dès qu&#8217;un fichier y sera déposé, il sera lu et transformé ensuite via notre transformer &laquo;&nbsp;StringToListOfMap&nbsp;&raquo; dont nous venons de voir le code.</p>
<pre name="code" class="xml">
&lt;model name="fromFileToDatabase"&gt;
  &lt;service name="myImportService"&gt;
    &lt;inbound&gt;
       &lt;file:inbound-endpoint path="/Users/nicolas/Dev/mule-poc/out/source"
                  pollingFrequency="3000" fileAge="5000"
                  moveToDirectory="/Users/nicolas/Dev/mule-poc/out/destination"
                  transformer-refs="StringToListOfMap"&gt;
       &lt;/file:inbound-endpoint&gt;
   &lt;/inbound&gt;
   ...
   ...
</pre>
<p>Je n&#8217;utilise aucuns composants particuliers. Il est temps de déclarer maintenant un outbound endpoint de type JDBC, utilisant notre query &laquo;&nbsp;writeTest&nbsp;&raquo;. La seule chose un peu spéciale est que j&#8217;utilise ici un list-message-splitter-router. Celui-ci prend en entrée une List d&#8217;élément et va automatiquement itérer cette List pour passer ensuite chacun des éléments au &laquo;&nbsp;jdbc:outbound-endpoint&nbsp;&raquo; en l&#8217;occurence une Map.</p>
<p>En cas d&#8217;exceptions je route les messages vers la sortie standard. Je pourrai aussi sauver vers un fichier les entrées invalides de mon fichier CSV.</p>
<pre name="code" class="xml">
 &lt;echo-component/&gt;
   &lt;outbound&gt;
        &lt;list-message-splitter-router&gt;
            &lt;jdbc:outbound-endpoint queryKey="writeTest"&gt;
                &lt;payload-type-filter expectedType="java.util.Map"/&gt;
            &lt;/jdbc:outbound-endpoint&gt;

            &lt;payload-type-filter expectedType="java.util.List"/&gt;
          &lt;/list-message-splitter-router&gt;
        &lt;/outbound&gt;

        &lt;default-connector-exception-strategy&gt;
                &lt;outbound-endpoint address="stdio://OUT"/&gt;
        &lt;/default-connector-exception-strategy&gt;

     &lt;/service&gt;
  &lt;/model&gt;
&lt;/mule&gt;
</pre>
<p>Une fois le tout compilé, je démarre mon instance de Mule via le script &laquo;&nbsp;startMuleServer.sh&nbsp;&raquo; en l&#8217;exécutant dans le répertoire bin.<br />
A l&#8217;execution, si je dépose le fichier &laquo;&nbsp;testDatabase.txt&nbsp;&raquo; dans le répertoire out/source, Mule le charge et le message suivant s&#8217;affiche dans la console :<br />
<code><br />
INFO  2008-12-23 15:24:48,927 [myImportService.2] org.mule.component.simple.LogComponent:<br />
********************************************************************************<br />
* Message received in service: myImportService. Content is: '0,2008-12-12,[Un  *<br />
* exemple de message tr?s simple],true                                         *<br />
* 1,2008-11-12,[Un autre exemple pour tester],fa...[100 of 141]'               *<br />
********************************************************************************<br />
</code></p>
<p>Un select dans la table retourne les 3 lignes du fichier testDatabase.txt comme attendu</p>
<p><strong>Conclusion</strong><br />
Dans cet exemple nous avons vu comment lire un fichier texte simple, comment transformer son contenu pour ensuite insérer directement des entrées dans une base de données. Mule Enterprise Edition propose des connecteurs avancés pour les traitements par Batch, plus efficace que l&#8217;import utilisé ici. Par ailleurs il est aussi possible de configurer les pools de connections en se basant sur les méthodes Spring standards.<br />
Mule est une solution qui évite l&#8217;écriture de code d&#8217;infrastructure, par essence du code souvent sans valeur ajouté. Cependant comme on peut le remarquer ici, il y a rapidement un besoin d&#8217;ajouter un peu de logique, ne serait-ce que pour la validation. Et cette logique s&#8217;écrit avec du code Java. J&#8217;ai aussi en stock un exemple avec Apache Camel, préparé pour Devoxx, que je vous proposerai prochainement dans un article sur le Touilleur.</p>
<p><strong>Code source de l&#8217;exemple :</strong><br />
<a href="http://www.touilleur-express.fr/code/mule-poc-touilleur.tar.gz">mule-poc-touilleur.tar.gz</a></p>
<p></votre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/12/23/exemple-mule-lire-un-fichier-csv-et-ecrire-vers-une-base-de-donnees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mule 2 : présentation à JavaPolis 2007</title>
		<link>http://www.touilleur-express.fr/2008/09/05/mule-2-presentation-a-javapolis-2007/</link>
		<comments>http://www.touilleur-express.fr/2008/09/05/mule-2-presentation-a-javapolis-2007/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 10:51:56 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[mule]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=295</guid>
		<description><![CDATA[Voici un compte-rendu en français de la présentation de Mule 2 de Ross Mason, le CTO et cofondateur de MuleSource Inc. Vous pouvez retrouver la vidéo en anglais à cette adresse. Bonne lecture.
Ross Mason a débuté le projet Mule en 2003. Avec un background en Finance et en Telco, Ross a débuté le projet Mule dans l&#8217;idée de créer un ESB open-source. Un ESB (Entreprise Service Bus) est un bus d&#8217;information, d&#8217;échange et de transformation de message. Mule remporte un succès car plus d&#8217;un million de téléchargement ont été effectués ...]]></description>
			<content:encoded><![CDATA[<p><strong>Voici un compte-rendu en français de la présentation de Mule 2 de Ross Mason, le CTO et cofondateur de MuleSource Inc. Vous pouvez retrouver la vidéo en anglais <a href="http://parleys.com/display/PARLEYS/Home#slide=1;talk=12058635;title=Mule%202%20and%20Beyond">à cette adresse</a>. Bonne lecture.</strong></p>
<p>Ross Mason a débuté le projet Mule en 2003. Avec un background en Finance et en Telco, Ross a débuté le projet Mule dans l&#8217;idée de créer un ESB open-source. Un ESB (Entreprise Service Bus) est un bus d&#8217;information, d&#8217;échange et de transformation de message. Mule remporte un succès car plus d&#8217;un million de téléchargement ont été effectués depuis la première version. 7 des 50 plus grosses entreprises dans le monde utilisent Mule. Il y a plus de 2500 développeurs sur les listes de diffusions, la communauté est donc active. 2000 applications sont en production avec Mule aujourd&#8217;hui.</p>
<p>La définition de Ross de Mule est &laquo;&nbsp;de permettre l&#8217;intégration de systèmes hétérogènes dans un même environnement&nbsp;&raquo;. Il s&#8217;agit de connecter différentes applications dont l&#8217;architecture est complétement différente. Un portail Web avec des sources de données. Des Services Adapters avec un bus de messagerie, etc.</p>
<p>Mule est composé d&#8217;un diffuseur de messages (Message Broker), d&#8217;un repository pour la configuration, d&#8217;un système de routage et de diffusions de messages, d&#8217;un moteur transactionnel, d&#8217;un moteur de transformation et enfin d&#8217;un moteur de gestion de workflow.</p>
<p>Mule peut donc recevoir un fichier, le transformer, diffuser via le routage des messages ou une partie de ce fichier à plusieurs applications, s&#8217;entourer d&#8217;une transaction pour réaliser le tout. La gestion de la sécurité est souple mais permet de gérer l&#8217;authentification et l&#8217;autorisation.</p>
<p><strong>Pourquoi choisir Mule ?</strong><br />
Mule tout d&#8217;abord ne force pas un type de message. Que votre architecture se base sur l&#8217;échange de fichiers XML, CSV, d&#8217;objets sérialisés ou de flux binaires, le moteur de transformation de Mule permet d&#8217;ajouter ces différents formats.<br />
Au niveau du code, Mule n&#8217;est pas intrusif et n&#8217;impose pas d&#8217;API externes. Les objets sont complètement portables, ce qui facilite les tests.<br />
Le fait que Mule ne force pas le format des messages en fait un outil non compatible avec la spécification JBI de Java. Cependant je pense que c&#8217;est un avantage qui permet d&#8217;avoir un système plus ouvert. Renseignez-vous sur ce sujet, je n&#8217;ai pas plus creusé.</p>
<p>Mule a été comparé à un couteau suisse. Il offre un grand nombre d&#8217;architectures de services. ESB est l&#8217;une des topologies, mais Mule peut très bien faire du Client-Serveur par exemple, en se basant sur des échanges synchrones, asynchrones de type message ou de type commande (rpc). Pour cette raison c&#8217;est une solution souple.</p>
<p>Un service web de type requete-réponse synchrone peut ensuite faire suivre un message asynchrone à une Queue JMS par exemple. C&#8217;est le principe de Mule.</p>
<p>L&#8217;intégration avec l&#8217;architecture J2EE est optionnelle. Le support de JBI, JMS, EJB, des connecteurs JCA, de JTA et des Servlets permet à Mule de s&#8217;intégrer dans une architecture J2EE existante sans problèmes.</p>
<p>La partie routage des messages a été écrite en se basant sur le livre &laquo;&nbsp;<a href="http://www.amazon.fr/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/ref=sr_11_1/402-9805282-0946563?ie=UTF8&#038;qid=1220605957&#038;sr=11-1">Enterprise Integration Pattern</a>&nbsp;&raquo; de Gregor Hohpe, , Bobby Woolf et Kyle Brown. C&#8217;est un livre de 2004 qui a encore beaucoup d&#8217;idées d&#8217;architecture simple.</p>
<p>La distribution transparente est une fonctionnalité de Mule qui permet de définir les règles d&#8217;échanges de messages dans la configuration. Ceci permet de faire des tests unitaires avec échanges de messages entre virtual machine, puis une fois en production d&#8217;utiliser un autre fichier de configuration avec des règles de distribution différentes. Très pratique dans le cadre des tests unitaires ou pour simuler (mock pattern) des interfaces clientes lorsque celles-ci ne sont pas disponibles. Pour la partie sécurité, Mule supporte JAAS ou Acegi pour l&#8217;authorisation.<br />
Mule est capable de gérer des objets existants, des POJOs ou des EJBs. Enfin Mule est réputé pour faciliter les tests et un framework complémentaire à JUnit facilite l&#8217;écriture des tests.</p>
<p><strong>L&#8217;architecture composant de Mule</strong><br />
Une instance de Mule est composée d&#8217;un Routeur entrant (Inbound Router), d&#8217;un composant unitaire (UMO Service Component) et enfin d&#8217;un Routeur sortant (Outbound Router).<br />
Les routeurs sont connectés à différentes applications via des Channels. Un Channel peut être un client web service ou un fichier plat sur un répertoire par exemple.</p>
<p><strong>Les nouveautés de Mule 2.0</strong><br />
La première nouveauté est un nouveau format de configuration XML basé sur des schémas, en lieu et place des anciennes DTD. Cela apporte pas mal de nouveautés pour la complétion de code dans IDEA IntelliJ par exemple. La configuration est plus simple et il n&#8217;est plus nécessaire de décrire toutes les classes. Un ensemble de XSD permet de simplifier la configuration des points d&#8217;entrées (endpoint).<br />
Il est possible d&#8217;associer un Endpoint avec une méthode Java, via un Proxy Java. Il y a une Registry de configuration et donc il n&#8217;y a plus de Mule Manager. La gestion des messages a été améliorée. Un nouveau type de transformation peut être appliqué automatiquement lorsqu&#8217;un type de message est appelé. Mule peut prendre en charge certaines transformations simples.<br />
Le Streaming est maintenant implicite pour les endpoints. Mule est gérable via JMX, ce qui facilite la gestion.</p>
<p>Mule est basé sur Spring pour sa partie configuration, cela se voit dès la lecture des fichiers de configuration. On retrouve l&#8217;idée de Spring 2.5. Son architecture est composée d&#8217;un Runtime Mule qui s&#8217;assure de la diffusion, de la gestion des Threads et des Transactions. La partie Transport supporte plus de 60 types différents. Cela inclus JMS, SOAP, Fichier plat, HTTP, FTP, SSH, JDBC, etc. La partie de routage permet l&#8217;échange de message. La partie transformation est capable d&#8217;effectuer un sacré nombre de tâches : XSLTC, CSV, Fix, ISO20022, Swift, objets Java&#8230; Il est possible d&#8217;appliquer un grand nombre de transformation.<br />
Mule peut enfin démarrer un petit conteneur web pour simplifier la configuration.</p>
<p><strong>Mule 2 configuration</strong><br />
Mule 2 se base sur le système de gestion d&#8217;espace de nomage de Spring 2. Chaque module a son propre espace de nom. Spring Bean peut être aussi ajouté dans la configuration de Mule 2. Le support de Seasar (sorte de Spring japonais) est aussi possible tout comme Hivemind ou Picocontainer.<br />
La différence que j&#8217;ai vu entre Mule 1 et Mule 2 est que dans la première version de Mule, il fallait connaitre le nom des classes Mule pour déclarer les connecteurs. Mule 2 se basant sur des espaces de noms XML comme Spring, vous pouvez déclarer directement un attribut xml correspondant au connecteur qui vous intéresse. De plus les propriétés de chaque connecteur sont différentes selon le nom du module et la validation est possible dès l&#8217;écriture de votre configuration Mule.</p>
<p>Ensuite Ross présente un exemple simple de service Mule, qui permet de lire un message sur l&#8217;entrée standard pour créer un objet Order, puis ensuite d&#8217;appeler un service de gestion de la commande pour créer un objet ProcessedOrder.<br />
Je retiens que Mule apporte toute la colle qui permet de créer le chemin suivant : lecture sur la console d&#8217;un message, transformation du message en objet Order, appel de la méthode process d&#8217;un service, récupération de l&#8217;objet ProcessedOrder et transformation de cette objet vers une String pour afficher un message de résultat. Le rôle de Mule via la configuration est donc de créer tous ces liens et d&#8217;orchestrer les appels des objets entre eux. Zéro ligne de code pour vous.</p>
<p>Ensuite un des intérêts ici est de montrer comment il est possible d&#8217;ajouter un nouveau point d&#8217;entrée sous la forme d&#8217;un service Web. Pour cela il déclare tout simplement une petite ligne dans le fichier de configuration, et via CXF un nouveau service web est automatiquement créé pour vous. Au lieu d&#8217;utiliser la console et l&#8217;entrée standard, vous pouvez maintenant appeler une méthode d&#8217;un service web pour refaire le même parcours.<br />
Si je résume : Mule permet d&#8217;ajouter via une ligne de configuration un nouveau point d&#8217;entrée à votre application.</p>
<p>Il montre ensuite comment appeler un service de vérification de crédit durant la transaction. Lorsque la commande est créé, on souhaite effectuer un appel à un service HTTP distant capable de nous dire si la carte de crédit est créditrice ou non pour valider le paiement. Le service est modifié pour recevoir par injection un objet CreditChecker. Le code est vraiment simple et on ne voit aucunes informations de transport, il est impossible de voir qu&#8217;il s&#8217;agira d&#8217;un appel HTTP ou via un Web Service. Mule crée du code agnostique et la partie transport/communication est masquée de son côté. Cela facilite en effet les tests unitaires.</p>
<p>Il montre ensuite un nouveau système d&#8217;extraction et de création des propriétés à l&#8217;execution. L&#8217;exemple qu&#8217;il montre est l&#8217;envoi d&#8217;un email à un destinataire, l&#8217;email est extrait avec une expression XPath à l&#8217;exécution.</p>
<pre name="code" class="xml">
<email:outbound-endpoint
           toAddress="${xpath:/message/customer/email}"></email>
</pre>
<p><strong>Autres nouveautés</strong><br />
Mule 2 a été réécrit pour faciliter la gestion des clusters. Mule 2 est prêt aussi à fonctionner avec OSGi car cela permettra d&#8217;apporter la gestion de version d&#8217;OSGi à Mule, ainsi que le déploiement à chaud. La gestion de version permettrait de ne redéployer qu&#8217;une partie de votre application et de ne mettre à jour que ce qui est nécessaire.</p>
<p><strong>La gestion du Streaming</strong><br />
Mule 2 est capable de gérer de gros volumes de données sans essayer de tout charger en mémoire. C&#8217;est indispensable par exemple lors de la génération de rapports financiers. Les données étant énormes, lorsque nous avons travaillé avec Kocktail chez Reuters je me souviens que cette partie était délicate. Si c&#8217;était à refaire aujourd&#8217;hui, je serai tenté de regarder si Mule ne peut pas aider et faciliter l&#8217;architecture de ce composant. Hasan si tu me lis&#8230; tu sais quoi faire.</p>
<p><strong>La gestion des erreurs</strong><br />
La gestion des exceptions est importante car pour la gestion des connecteurs c&#8217;est ce qui apporte des règles de tolérance de pannes. Pour les exceptions des connecteurs (un service web distant est tombé&#8230;) il est possible de configurer dans Mule des règles de routage différente pour gérer les problèmes réseaux par exemple. JMX permet de surveiller un composant Mule afin de détecter des pannes, chose importante pour l&#8217;exploitation et les équipes de production (spéciale dédicace à Gik de l&#8217;INA).</p>
<p><strong>Les transactions</strong><br />
A mon avis c&#8217;est la partie la plus délicate de Mule. Tout se configure via les fichiers de configuration. Mule supporte les transactions de type Local ou XA. Plusieurs serveurs d&#8217;applications sont supportés comme Weblogic ou JBoss. Le support d&#8217;Arjuna ou Atomika est aussi possible. Mule peut utiliser les gestionnaires de transaction des serveurs d&#8217;application comme Weblogic par exemple, en passant via JNDI pour retrouver le gestionnaire de transaction.</p>
<p><strong>La montée en charge</strong><br />
Dans ce slide, Ross explique pourquoi Mule est scalable. Mule est basé sur le modèle <a href="http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf ">SEDA</a> (Straged Event Driven Architecture).<br />
Je fais une aparté pour parler de SEDA, ou de ce que j&#8217;en ai retenu en lisant le PDF.<br />
Le problème : comment gérer un grand nombre de requêtes dans un serveur ? Quelle est la meilleur architecture pour traiter 1000 requêtes à la fois ?</p>
<p>Tout d&#8217;abord voyons l&#8217;architecture multi-threadée classique :<br />
Un serveur Web classique peut par exemple démarrer une thread par requête. Si cela semble une bonne idée au premier abord, charger une image du disque ou faire un appel dynamique à un EJB ne coûte pas la même énergie. Et ce modèle threadé est donc &laquo;&nbsp;bête&nbsp;&raquo; car il consomme des Threads pour des choses simples. Pour répondre à cela, est apparu les modèles orientés événement comme celui au coeur de Flash. A chaque événement système un ordonnanceur envoie des événements à un nombre limité de threads qui gérent une machine à état. Imaginez la distribution de cartes dans une partie de Poket. Il y a 5 joueurs et le donneur donne des cartes. Certains joueurs vont terminer le boulot avant les autres (se coucher&#8230;) et d&#8217;autres vont travailler plus longtemps. Le souci de cette 2ème architecture de distribution est que l&#8217;on assume que la lecture des événements n&#8217;est pas bloquant. En clair, cela veut dire que lorsque je distribue les cartes, mes joueurs ne me bloquent pas et je passe au joueur suivant. Or c&#8217;est parfois difficile en vrai. De plus, si l&#8217;une de mes Threads prend 90% du CPU pendant que je distribue mes tâches, je suis impacté et toute l&#8217;application se met à ramer.<br />
Pour revenir à mon exemple avec le poker, la limitation de l&#8217;architecture orienté message est que lorsque l&#8217;ordonnanceur (le donneur) distribue les cartes il n&#8217;attend pas la réponse de chaque joueur et donc il va très vite, sans s&#8217;arrêter. Si ensuite il doit être bloqué par un joueur, comme lorsqu&#8217;il demande ce que veut faire le joueur, alors le modèle est bloqué. Donc ce type de distribution des tâches fonctionne tant que les machines à état ne bloquent pas le scheduler.<br />
Pour cette raison, SEDA propose une 3ème architecture. Tout d&#8217;abord on ajoute la notion d&#8217;étape, pour que la gestion d&#8217;un événement soit effectué par petite étape très rapide. Ensuite on ajoute des queues pour effectuer la gestion des événements. Enfin SEDA fonctionne avec un système d&#8217;allocation dynamique des ressources afin d&#8217;ajuster à la charge le nombre de Threads. Tout ceci mis en place dans Mule promet donc une architecture mature et capable de monter en charge. La gestion des Threads est un cauchemar, je n&#8217;ai jamais vu une application parfaite en Java 1.4.<br />
Je me souviens d&#8217;une discussion avec un ami, Flavien, qui m&#8217;expliquait que son équipe avait écrit un moteur d&#8217;envoi de MMS massivement parrallèle. L&#8217;implémentation initiale en Java se trainait à 100 MMS par seconde. Une nouvelle implémentation en C avec une architecture différente permet maintenant d&#8217;envoyer entre 2000 et 3000 MMS à la seconde&#8230;</p>
<p>Pour Mule, le modèle SEDA est appliqué à JMS dans Mule ainsi que la notion de Spaces emprunté à Java Spaces.</p>
<p><strong>Load balancing et Failover</strong><br />
Ross présente dans ce slide les capacités de répartition de charge et de gestion des pannes de Mule 1 et Mule 2. Mule 2.1 aura un support natif du clustering.</p>
<p><strong>MuleForge</strong><br />
<a href="http://www.muleforge.org/">MuleForge</a> est une communauté destinée aux utilisateurs de Mule pour partager des projets basés sur Mule. Par exemple des Transformers spéciaux, des connecteurs pour SAP, Salesforces.com, SIP ou SMS par exemple.  Il y a déjà 80 projets hébergés sur ce site.<br />
Allez voir la page <a href="http://www.muleforge.org/activeprojects.php">http://www.muleforge.org/activeprojects.php</a> qui contient des connecteurs pour du Single Sign On, du LDAP, du SFTP, etc.</p>
<p><strong>Mule HQ</strong><br />
Il s&#8217;agit d&#8217;une console de surveillance et d&#8217;administration qui permet via JMX de surveiller des instances Mule. C&#8217;est un peu le domaine sur lequel j&#8217;ai travaillé pour l&#8217;INA afin de surveiller et d&#8217;administrer des serveurs avec une application en Flex. Intéressant de voir ce que Mule propose, c&#8217;est une réelle demande des équipes d&#8217;exploitation et de production.</p>
<p>Ensuite Ross présentera MuleIDE, un plugin pour Eclipse qui facilite l&#8217;écriture de modules Mule.</p>
<p><strong>Conclusion</strong><br />
Voilà c&#8217;est tout pour cette transcription, j&#8217;espère que cela vous aura donné envie de tester Mule et d&#8217;y penser pour vos prochaines architectures.<br />
A bientôt.</p>
<p><strong>Annexes</strong></p>
<ul>
<li>Le site de Mule : <a href="http://www.mulesource.com/">http://www.mulesource.com/</a></li>
<li>Blog Octo : <a href="http://blog.ippon.fr/tag/ross-mason">http://blog.ippon.fr/tag/ross-mason</a></li>
<li><a href="http://www.amazon.fr/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/ref=sr_11_1/402-9805282-0946563?ie=UTF8&#038;qid=1220605957&#038;sr=11-1">Livre Enterprise Integration Pattern</a> sur Amazon.fr</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/09/05/mule-2-presentation-a-javapolis-2007/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>La rentrée : groovy</title>
		<link>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/</link>
		<comments>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 11:28:43 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[mule]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=280</guid>
		<description><![CDATA[Un peu d&#8217;actualité sur Paris et quelques liens à regarder.
La prochaine soirée du Paris Java User Group aura lieu mardi soir prochain à Paris à l&#8217;ISEP à partir de 19h15 autour du langage Groovy présenté par Guillaume Laforge, chef de projet de Groovy et membre de l&#8217;OSSGTP. L&#8217;intérêt de Groovy est à mon avis de dépasser l&#8217;étape de langage de script pour vraiment apporter à la plateforme Java un langage dynamique. Guillaume est aussi spec-lead de la JSR-241 qui vise à standardiser Groovy au sein de la plateforme Java. Groovy ...]]></description>
			<content:encoded><![CDATA[<p>Un peu d&#8217;actualité sur Paris et quelques liens à regarder.</p>
<p>La prochaine soirée du Paris Java User Group aura lieu <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20080909">mardi soir prochain à Paris à l&#8217;ISEP à partir de 19h15</a> autour du langage Groovy présenté par Guillaume Laforge, chef de projet de Groovy et membre de l&#8217;OSSGTP. L&#8217;intérêt de Groovy est à mon avis de dépasser l&#8217;étape de langage de script pour vraiment apporter à la plateforme Java un langage dynamique. Guillaume est aussi spec-lead de la <a href="http://jcp.org/en/jsr/detail?id=241">JSR-241</a> qui vise à standardiser Groovy au sein de la plateforme Java. Groovy permet de retirer pas mal de code d&#8217;assemblage et de s&#8217;approcher de la mouvance des langages de script amorcée avec Java 6.</p>
<p>On ne peut pas parler de Groovy sans parler de <a href="http://grails.org/">Grails</a>, le framework MVC basé sur Groovy. La deuxième partie de la soirée sera donc consacrée à la présentation de Grails par Fabrice Robini, architecte chez Octo.<br />
J&#8217;attends avec impatience de voir un peu une présentation en live de Grails. J&#8217;espère que Fabrice pourra refaire ce que Jean-François Hélie et Christian Blavier nous avaient proposé <a href="http://www.touilleur-express.fr/2008/06/11/compte-rendu-de-la-soiree-spring-pjug/">en juin dernier</a>.</p>
<p>Le 18 septembre se déroulera aussi le <a href="http://code.google.com/intl/fr_ALL/events/developerday/2008/home.html">Google Developer Day 2008</a> à l&#8217;ENSA. Les sessions sur GWT et sur AppEngine pourraient intéresser pas mal de monde. Je ne manquerai pas de vous en faire un petit compte-rendu.</p>
<p>Si vous voulez vous regarder quelques petites vidéos sympathiques, je vous conseille de regarder les vidéos de <a href="http://jazoon.com/">Jazoon 2008</a> une conférence dont je vous avais parlé <a href="http://www.touilleur-express.fr/tag/jazoon/">il y a quelques mois déjà</a>.</p>
<p>A propos de vidéo, si vous souhaitez regarder tranquillement un screencast de votre MacBook Pro préféré, le site <a href="http://parleys.com">Parleys.Com</a> héberge un certain nombre de vidéo sur l&#8217;écosystème Java, Spring, Mule, JBoss et compagnie. Je vous recommande par exemple <a href="http://parleys.com/display/PARLEYS/Home#talk=12058635;title=Mule%202%20and%20Beyond;slide=1">la présentation de Mule 2</a> de Ross Masson ou <a href="http://parleys.com/display/PARLEYS/Home#talk=8112;title=Spring%202.0%20and%20Beyond;slide=1">l&#8217;intervention de  Rod Johnson</a> sur Spring 2.<br />
Au passage on note que le site a été réalisé avec Adobe Flex et qu&#8217;il existe même une version AIR. Pas mal non ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2008/09/02/la-rentree-groovy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

