<?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; esb</title>
	<atom:link href="http://www.touilleur-express.fr/tag/esb/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>Integrate Apache Camel with Apache Wicket</title>
		<link>http://www.touilleur-express.fr/2009/03/03/integrate-apache-camel-with-apache-wicket/</link>
		<comments>http://www.touilleur-express.fr/2009/03/03/integrate-apache-camel-with-apache-wicket/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 16:52:24 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[camel]]></category>
		<category><![CDATA[esb]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://www.touilleur-express.fr/?p=816</guid>
		<description><![CDATA[This article is a translation of an original article I published a while ago about how to integrate Apache Camel with Apache Wicket.
In this article I propose that we have a look on a very simple usage of the lightweight integration framework Apache Camel with one of the most popular Java Web framework : Apache Wicket. The article&#8217;s source code is available at the end of this article, ready to be compiled, so that you can test freely from home. If you&#8217;d like to reuse this article or its source ...]]></description>
			<content:encoded><![CDATA[<p><strong>This article is a translation of <a href="http://www.touilleur-express.fr/2009/01/10/exemple-dintegration-dapache-wicket-et-apache-camel/">an original article</a> I published a while ago about how to integrate Apache Camel with Apache Wicket.</strong></p>
<p>In this article I propose that we have a look on a very simple usage of the lightweight integration framework Apache Camel with one of the most popular Java Web framework : Apache Wicket. The article&#8217;s source code is available at the end of this article, ready to be compiled, so that you can test freely from home. If you&#8217;d like to reuse this article or its source code, please contact me before since it is not free for distribution. My email is displayed on the upper left logo.</p>
<p><strong>What is  Apache Wicket ?</strong><br />
<a href="http://wicket.apache.org/">Wicket</a> is an open-source java framework that unlike a framework such as Struts 1, is component oriented. It lets you define your pages using plain Java, and then integrate them in static HTML source code with light tags, so that everything is displayed with a light application server such as Apache Tomcat for instance.<br />
When I was a projet leader at Reuters last year, my job was to be the person in charge for a proprietary framework, Karma, which is very close to Wicket. Thus it wasn&#8217;t very hard to jump into the Wicket world. Component oriented frameworkd such as Wicket eases the development and is more close to what we&#8217;ve been doing for decade with Swing.</p>
<p>In this article we will see how to create your first Wicket page, a custom component, and integrate Spring with Apache Camel to load our configuration. The most interesting concept about Wicket is that the event model is very close to Swing. You basically implement listeners and based on the Observer-Observable pattern, the Wicket engine notifies your logic depending on the user action on the web page. With the support of Ajax, it&#8217;s a very interesting solution to learn.</p>
<p><strong>What is Apache Camel ?</strong><br />
Apache Camel is an open-source framework based on Spring Core framework. It&#8217;s an implementation of the populars EIP (Enterprise Integration Patterns) that offers either XML for configuration (like Mule) or a nice DSL based on Java, which I personaly prefer. We will use the Java DSL in this article.<br />
Apache Camel is a good add-on for Mule. For me, Mule is a lightweight integration framework, not only an ESB. Camel is a toolbox that you can also integrate with Mule. In this architecture, Mule will be in charge for I/O and the Threading model. Camel would be in charge of routing, transform and mediation tasks. Here we will use only Camel, since my solution is pretty simple.</p>
<p><strong>Content of the demonstration</strong><br />
I started to work on this article in november, with the aim to present this work at Devoxx during my <a href="http://www.touilleur-express.fr/2008/12/27/devoxx-esb-in-financial-application/">quickie on ESB at Devoxx 2008</a>. I quickly realized that it wouldn&#8217;t fit in the amount of time allocated for a quickie. I posted the french version in january and now you&#8217;re reading the english translation.</p>
<p><strong>&#8230; and why didn&#8217;t you take Mule/Spring Integration/Apache ServiceMix/OpenESB/AnyOtherIntegrationFramework ?</strong><br />
I really appreciate the hard work behind the other Integration framework but for the purpose of this article, Camel is enough. It would be very interesting to publish the same article based on Spring Integration for instance. Let me know if you plan to write such article so that we can reference it here !</p>
<p><strong>The sample application</strong><br />
Let&#8217;s start with what you will see once completed. Remember : the source code is available at the end of this article.<br />
Unzip, open a xterm and simply type &laquo;&nbsp;mvn jetty:run&nbsp;&raquo;. Open a web browser and here is what you&#8217;ll see:</p>
<p><img src="http://www.touilleur-express.fr/wp-content/camel_wicket_01.jpg" alt="camel_wicket_01" title="camel_wicket_01" width="743" height="702" class="alignnone size-full wp-image-662" /></p>
<p>As a customer I put my name in a form, and a litle message to ask why my great PS3 wasn&#8217;t delivered for christmans.<br />
I click the submit button and a nice &laquo;&nbsp;Thanks&nbsp;&raquo; message is displayed. So far, so good.</p>
<p><img src="http://www.touilleur-express.fr/wp-content/camel_wicket_02.jpg" alt="camel_wicket_02" title="camel_wicket_02" width="428" height="350" class="alignnone size-full wp-image-663" /></p>
<p><strong>What&#8217;s happening in the background ?</strong><br />
When I click the Send button, Wicket generates a message for Apache Camel. It transforms this message and store-it to a file, to demonstrate how to save a message on the local filesystem. I don&#8217;t say this is what you should do. I just want to demonstrate some of Camel&#8217;s features. So please don&#8217;t blame me for what the application is doing, we&#8217;re more interested by HOW it is doing it.<br />
We have another async process in Camel that polls this folder. For any incoming file, it reads it, transforms it using Velocity and then generate an email. We will use an outgoing silo so that Apache Camel send to an SMTP server the email.<br />
For my article I use MockMail, it&#8217;s a fake SMTP server that&#8217;s really easy to use, especially for JUnit test.</p>
<p><strong>The administrator view</strong><br />
The admin page is a wicket page that reads the inbox with POP3 and display a list of customer&#8217;s requests to the web site administrator. We will see how it is simple to implement our own Wicket component to iterate a collection of Messages.</p>
<p><strong>First steps with Wicket, &laquo;&nbsp;Bonjour le monde&nbsp;&raquo;/&nbsp;&raquo;Hello world&nbsp;&raquo;</strong><br />
Download the source code and open InnoteriaWicketApplication java class with your favorite IDE (mine is IDEA IntelliJ). This class is our Wicket main application entry point. I use <a href="https://mock-javamail.dev.java.net/">Mock JavaMail</a> to declare a MailBox.<br />
The class ReportIncidentEndpoint is one of my Apache Camel component. It&#8217;s the gate to the Camel world here for Wicket.</p>
<pre name="code" class="java">
public class InnoteriaWicketApplication extends WebApplication {
    private ApplicationContext ctx;
    private ReportIncidentEndpoint endpoint;
    private Mailbox mailbox;   // mock javamail

    private static ISpringContextLocator CTX_LOCATOR = new ISpringContextLocator() {
        public ApplicationContext getSpringContext() {
            return InnoteriaWicketApplication.get().ctx;
        }
    };

    public InnoteriaWicketApplication() {
    }

    public Class getHomePage() {
        return HomePage.class;
    }

    public static InnoteriaWicketApplication get() {
        return (InnoteriaWicketApplication) Application.get();
    }

    @Override
    protected void init() {
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Address address= null;
        try {
            address = new InternetAddress("incident@innoteria.fr");
        } catch (AddressException e) {
            e.printStackTrace();
        }
        mailbox = new Mailbox(address);
    }

    /**
     * This trick is used to decorate a specified template class with a SpringBeanLocator
     * so that I can use Spring to load my Apache Camel configuration.
     * @param clazz will be the endpoint to decorate
     * @param &lt;T&gt; template
     * @return a decorated class.
     */
    private &lt;T&gt; T createProxy(Class&lt;T&gt; clazz){
        return (T) LazyInitProxyFactory.createProxy(clazz, new SpringBeanLocator(clazz, CTX_LOCATOR));

    }

    public ReportIncidentEndpoint getReportIncidentEndpoint(){
        if(endpoint==null){
            endpoint=createProxy(ReportIncidentEndpoint.class);
        }
        return endpoint;
    }

}
</pre>
<p>It is now time to write your first page, the HomePage class. It extends the WebPage class. We see that a FeedbackPanel component has been declared with 2 text fields. We also added a Form. The onSubmit method will be trigger when the user submits the form from the web page. We will see later how an instance of MyReportIncident is used to hold details later.<br />
In a few lines, as you can see it&#8217;s pretty simple to implement a Form and to trigger an action when the user clicks a button.</p>
<pre name="code" class="java">
public class HomePage extends WebPage {

    private static final long serialVersionUID = 1L;

    public HomePage(final PageParameters parameters) {
        // un de mes composants
        FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
        add(feedbackPanel);

        final TextField yourName = new TextField("yourname", new Model());
        final TextField yourMessage = new TextField("yourmessage", new Model());
        yourMessage.setRequired(true) ;
        yourName.setRequired(true);

        Form form = new Form("formtest") {
            protected void onSubmit() {
                ReportIncidentEndpoint service = InnoteriaWicketApplication.get().getReportIncidentEndpoint();
                service.reportIncident(
                        new MyReportIncident(
                                yourName.getModelObject().toString(),
                                yourMessage.getModelObject().toString()
                        ));
                info("Thanks!");
            }
        };

        form.add(yourName);
        form.add(yourMessage);

        // Add a form with an onSubmit implementation that sets a message
        add(form);

        /* java code */
        add(new BookmarkablePageLink("link", CheckMailbox.class));

    }
}
</pre>
<p>Let&#8217;s see on the HTML side how does it work. If you open HomePage.html we see:</p>
<pre name="code" class="html">
...
<div id="formForEmail">
<form wicket:id="formtest">
                Your name
<input type="text" wicket:id="yourname"/>
                Your message:
<input type="text" wicket:id="yourmessage" size="40" maxlength="40"/>
<input type="submit" value="Send your request"/>
            </form>
</div>

...
</pre>
<p>Wicket relies on the ID declared in the HTML to create a proxy between the HTML view and the Java side. Wicket really lets you play and design the HTML without the need to use complex components syntax. The HTML code is clean and you can even preview it with IDEA IntelliJ to validate that the layout is correct.<br />
Enough for my short introduction to Wicket, I let you have a look at the code while I prepare the next step.<br />
Browse the source code, try to compile and deploy with maven 2 (mvn jetty:run) and when you&#8217;re ok to continue, come back here.</p>
<p><strong>The Apache Camel side</strong><br />
Our entry point in Camel is ReportIncidentEndpoint. The reportIncident method is notified by Wicket when the user clicks the send button in the user interface. It publishes to an in-memory Queue handled by Apache Camel. ReportIncidentEndpoint is a Spring Bean which gets injected into  InnoteriaWicketApplication.</p>
<pre name="code" class="java">
/**
 * @author Nicolas Martignole http://touilleur-express.fr
 */
public class ReportIncidentEndpoint implements Serializable {
    private CamelContext context;
    private static final long serialVersionUID=2233L;

    public ReportIncidentEndpoint() throws Exception {
        // create the context
        context = new DefaultCamelContext();

        // append the routes to the context
        context.addRoutes(new ReportIncidentRoutes());

        // at the end start the camel context
        context.start();
    }

    /**
     * Callback method executed from the HomePage when the user
     * clicks on submit.
     * @param message is a message created by Wicket
     * @return a status message that is shown on HomePage.
     */
    public String reportIncident(MyReportIncident message) {
        // create the producer template to use for sending messages
        ProducerTemplate producer = context.createProducerTemplate();

        // Send the message to an in-memory queue and return
        // See GenerateEmailStoreToFilePollFolderAndSendFile
        // it will read the message from direct:start in-memory queue
        Object mailBody = producer.sendBody("direct:start", message);
        System.out.println("Body:" + mailBody);

        return "OK";
    }

}
</pre>
<p>Let&#8217;s see now how we integrate our application with Apache Camel. I stated explicitly 2 roads to show you one of Camel&#8217;s principle. Open ReportIncidentRoutes in your editor. This class extends RouteBuider, a Camel super class that lets you define the logical path within your application. Please note that XML is also an option.<br />
Note that it is also possible to use XML to define your route, but here I find elegant the java definition of  your path, especially when your architecture will not change any further.</p>
<p>The first road:<br />
- reads the in-memory queue &laquo;&nbsp;direct:start&nbsp;&raquo;<br />
- calls a Velocity template to generate a message<br />
- saves set the file on the file system.</p>
<p>Please note that it would be very simple to replace the &laquo;&nbsp;save file on disk&nbsp;&raquo; operation with a &laquo;&nbsp;generate and send JMS Message&nbsp;&raquo; to a Queue. For the purpose of this article it&#8217;s simplier to use an in-memory queue or the file system.</p>
<pre name="code" class="java">
public class ReportIncidentRoutes extends RouteBuilder {
    // Any message posted on direct:start will be
    // handled by velocity template, then persisted on the file system
    public void configure() throws Exception {
        from("direct:start")
            .to("velocity:MailBody.vm")
                .setHeader(FileComponent.HEADER_FILE_NAME, "errorEmail.txt")
                .to("file:///./target/demoCamel?append=false");
       ...
</pre>
<p>Let&#8217;s add another Camel path/road. The second road :<br />
- polls the folder for any incoming file<br />
- adds an email subject to the message<br />
- connects to a real SMTP server and publish the message</p>
<p>Do you remember that we created a MockMail Mailbox in InnoteriaWicketApplication ? Once this application is deployed, MockMail starts to listen for incoming SMTP requests on port 25. Try a telnet localhost 25, you should see that someone is listening ! So our application will really send an email. You can adapt the source code and use the GMail SMTPs server if you want to complete this article.<br />
Here, the user name is nicolas. We will use it later to retrieve the list of email with POP3.</p>
<pre name="code" class="java">
 from("file:///./target/demoCamel")
            .setHeader("subject", constant("New incident reported"))
           .to("smtp://nicolas@localhost?password=secret&#038;to=incident@innoteria.fr");
</pre>
<p>Apache Camel is a framework that can simplify your source code. I picked another sample to demonstrate one of its nice feature : a simple rules engine that would be enough in most use cases :</p>
<p><code><br />
 // sample 1 if the header key foo is equals to bar then forward to b queue<br />
from("queue:a").filter(header("foo").isEqualTo("bar")).to("queue:b");</p>
<p> // sample 2<br />
from("queue:c").choice()<br />
                .when(header("foo").isEqualTo("bar")).to("queue:d")<br />
                .when(header("foo").isEqualTo("cheese")).to("queue:e")<br />
                .otherwise().to("queue:errorQueue");<br />
</code></p>
<p>Apache Camel is an interesting solution. It aims to reduce the amount of technical code in your application, usually required to read a file, generate an email and send it to a SMTP server. The idea behind this framework is to ease integration with external systems such as JMS, SSH, FTP, File, SMTP or FTP. Don&#8217;t hesitate to go on Apache Camel web site and have a look at the documentation, there&#8217;s a lot of interesting use cases.</p>
<p><strong>How can I read the mailbox content and display a list of emails ?</strong><br />
Let&#8217;s go back to Wicket. We will see in a minut how to create your own component. The next user story is : how can I read the list of incoming customer&#8217;s request from my administrator web page ?<br />
If you click on the  &laquo;&nbsp;Check Incident Mailbox&#8230;&nbsp;&raquo; on the home page you&#8217;ll see this screen :</p>
<p><img src="http://www.touilleur-express.fr/wp-content/camel_wicket_03.jpg" alt="camel_wicket_03" title="camel_wicket_03" width="565" height="401" class="alignnone size-full wp-image-664" /></p>
<p>CheckMailbox class is a Wicket web page that fetches the list of email sent to incident AT innoteria.fr. An Iterator of Message is used by our custom component to display each message. I had to add an Adapter for Message, cause javax.mail.Message is not Serializable. Wicket requires Serializable instance. This is an usage of Iterator and Adapter pattern by the way.</p>
<pre name="code" class="java">
public class CheckMailbox extends WebPage {
    private static final long serialVersionUID = 1L;

    public CheckMailbox(final PageParameters parameters) {
        Address address = null;
        try {
            address = new InternetAddress("incident@innoteria.fr");
        } catch (AddressException e) {
            e.printStackTrace();
        }
        Mailbox mailbox = Mailbox.get(address);
        // javax.mail.message subclasses are not serializable
        // thus we need this little trick to adapt our collection.
        // I don't wan use collections-utils and folks, it's too simple.
        InnoteriaMessageIterator imi=new InnoteriaMessageIterator(mailbox.iterator());
        MessagePanel rv = new MessagePanel("repeatingPanel",imi);
        add(rv);
    }

}
</pre>
<p><strong>My first component</strong><br />
The class MessagePanel is a Wicket component, attached with its own subset of HTML. DisplayMessagePanel is a Panel included in MessagePanel. When I wrote my code I thought it would be useful to add some more components, but I didn&#8217;t finnish. Anyway&#8230;</p>
<p>I really appreciate how  Wicket describes components.</p>
<pre name="code" class="java">
public class DisplayMessagePanel extends Panel {

    public DisplayMessagePanel(String id, final InnoteriaMessageIterator listOfMessages) {
        super(id);

        add(new RefreshingView("repeatingView") {

            @Override
            protected Iterator getItemModels() {
                return new ModelIteratorAdapter(listOfMessages.iterator()) {
                    @Override
                    protected IModel model(Object o) {
                        return new CompoundPropertyModel((InnoteriaMessage) o);
                    }
                };

            }

            @Override
            protected void populateItem(Item item) {
                // Those 3 properties are read directly on InnoteriaMessage POJO
                // See CompoundPropertyModel javadoc for more details
                item.add(new Label("subject"));
                item.add(new Label("from"));
                item.add(new Label("content"));
            }
        });
    }
}
</pre>
<p><strong>Conclusion</strong><br />
I hope you appreciate, I spent a lot of time to write this article. The idea was to demonstrate Apache Wicket and Apache Camel with a real use case. It would be interesting to write the Spring Integraton or the Mule version. Not a lot of work but I have already some article to complete&#8230;</p>
<p>If you appreciate reading this article, please vote for it on <a href="http://www.dzone.com/links/apache_wicket_and_apache_camel_write_your_first_a.html">DZone</a></p>
<p>Source code:<br />
<a href="http://www.touilleur-express.fr/code/touilleur_wicket_camel_1.0.tar.gz">touilleur_wicket_camel_1.0.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2009/03/03/integrate-apache-camel-with-apache-wicket/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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>Construire une application d&#039;entreprise nouvelle génération avec AJAX en utilisant echo2, EJB et ServiceMix ESB</title>
		<link>http://www.touilleur-express.fr/2006/12/04/construire-une-application-dentreprise-nouvelle-generation-avec-ajax-en-utilisant-echo2-ejb-et-servicemix-esb/</link>
		<comments>http://www.touilleur-express.fr/2006/12/04/construire-une-application-dentreprise-nouvelle-generation-avec-ajax-en-utilisant-echo2-ejb-et-servicemix-esb/#comments</comments>
		<pubDate>Mon, 04 Dec 2006 14:39:43 +0000</pubDate>
		<dc:creator>Nicolas Martignole</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[esb]]></category>

		<guid isPermaLink="false">http://www.touillleur-express.fr/?p=59</guid>
		<description><![CDATA[Le titre de ce post est long mais c&#8217;est la traduction d&#8217;un témoignage très intéressant d&#8217;un architecte sur un projet nouvelle génération. L&#8217;article Building an Enterprise Scale Mass Market AJAX Web Site using echo2, EJB3 and ServiceMix ESB présente la réalisation d&#8217;une application de recherche de prêt immobilier.
Les choix techniques pour l&#8217;architecture de la solution sont:

User Interface: echo 2
Application Server: JBoss Application Server 4
Integration with Mortgage Providers: ServiceMix
Persistence Mechanism: MySQL
CMS System: Hippo
Object Relational mapping: Hibernate 3
Dependency Injection: Spring

Pour la couche UI, RDF Group utilise echo2 un framework open-source Ajax très ...]]></description>
			<content:encoded><![CDATA[<p>Le titre de ce post est long mais c&#8217;est la traduction d&#8217;un témoignage très intéressant d&#8217;un architecte sur un projet <b>nouvelle génération</b>. L&#8217;article <a href="http://enterprise-technical-architecture.blogspot.com/2006/11/building-enterprise-scale-mass-market_29.html">Building an Enterprise Scale Mass Market AJAX Web Site using echo2, EJB3 and ServiceMix ESB</a> présente la réalisation d&#8217;une application de recherche de prêt immobilier.</p>
<p>Les choix techniques pour l&#8217;architecture de la solution sont:</p>
<ul>
<li>User Interface: echo 2</li>
<li>Application Server: JBoss Application Server 4</li>
<li>Integration with Mortgage Providers: ServiceMix</li>
<li>Persistence Mechanism: MySQL</li>
<li>CMS System: Hippo</li>
<li>Object Relational mapping: Hibernate 3</li>
<li>Dependency Injection: Spring</li>
</ul>
<p>Pour la couche UI, RDF Group utilise <a href="http://www.nextapp.com/platform/echo2/echo/">echo2</a> un framework open-source Ajax très sympa. L&#8217;intérêt de ce composant est de proposé un modèle orienté widgets/composants qui est à la fois simple à programmer et puissant. Allez voir les démos echo2 pour vous faire une idée de ce qu&#8217;il est possible de faire faire à votre navigateur&#8230; Je me sens un peu chez moi puisque le projet que j&#8217;encadre est similaire à echo2 ou encore <a href="http://www.zkoss.org">ZK Ajax</a></p>
<p>Pour la couche Business Logic, RDF Group a fait le choix d&#8217;utiliser <a href="http://servicemix.org/site/home.html">Apache ServiceMix 3.0</a>, projet open-source de la communauté Apache. Ce framework propose un bus de données d&#8217;entreprise (ESB) pour s&#8217;intégrer dans une architecture SOA. Il est construit à la base sur la spécification JBI JSR208 qui est dit comme étant l&#8217;implémentation Java de référence pour l&#8217;orchestratio de services. J&#8217;ai parlé il y a un temps de SCA, la proposition des gros éditeurs (BEA, Sybase, Oracle&#8230;) et je ne sais plus si j&#8217;ai parlé de Microsoft Indigo, l&#8217;architecture proposée par Microsoft qui est aussi intéressante.<br />
<b>ServiceMix</b> utilise Spring et intégre des API très intéressante comme le moteur de règles <a href="http://servicemix.org/site/servicemix-drools.html">Drools</a>. Ce moteur de règle devrait donc permettre de proposer des services d&#8217;évaluation de Business Object vraiment intéressant.<br />
La couche de Binding propose les protocoles suivants:</p>
<ul>
<li>HTTP</li>
<li>JMS</li>
<li>JavaMail</li>
<li>WSIF</li>
<li>Jabber (instant messaging)</li>
</ul>
<p>La couche Services package les couches métiers SOAP suivantes:</p>
<ul>
<li>WS-Notification</li>
<li>WS-Reliable Messaging</li>
<li>WS-Eventing</li>
<li>WS-Resources Properties</li>
<li>WS-Distributed Managment</li>
</ul>
<p>Quant à la couche Components voici ce que l&#8217;on y trouve:</p>
<ul>
<li>ActiveMQ pour la fabrication de message</li>
<li>ActiveSOAP</li>
<li>Mule (Object Brooket)</li>
<li>Groovy pr le scripting</li>
<li>Drools (moteur de regles)</li>
<li>PXE (BPEL)</li>
<li>Agila (Workflow)</li>
</ul>
<p>Concernant les serveurs J2EE, ServiceMix s&#8217;integre avec Apache Geronimo facilement. Il y a auss <a href="http://servicemix.org/site/jboss-deployer.html">le support de JBoss</a> et donc la possibilité de construire facilement un bus de données.<br />
Pour vous faire une idée de ServiceMix je vous conseille la lecture <a href="http://goopen.org/confluence/display/SM/1.+Quick+start">du UserGuide sur leur Wiki</a>.</p>
<p>Dès que j&#8217;ai un peu de temps je testerai ServiceMix et je ne manquerai pas de revenir ici autour d&#8217;un café en parler avec vous.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touilleur-express.fr/2006/12/04/construire-une-application-dentreprise-nouvelle-generation-avec-ajax-en-utilisant-echo2-ejb-et-servicemix-esb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

