{"id":772,"date":"2012-05-11T09:05:09","date_gmt":"2012-05-11T07:05:09","guid":{"rendered":"http:\/\/blog.fabianpiau.com\/?p=772"},"modified":"2024-12-30T14:47:59","modified_gmt":"2024-12-30T14:47:59","slug":"first-steps-with-apache-camel","status":"publish","type":"post","link":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/","title":{"rendered":"Une premi\u00e8re approche du Camel d&rsquo;Apache"},"content":{"rendered":"<p><a class=\"lang\" href=\"https:\/\/blog.fabianpiau.com\/en\/2012\/05\/11\/first-steps-with-apache-camel\/\" title=\"Read in english\"><strong class=\"labellang\"><span class=\"en\">&nbsp;<\/span>English version available<\/strong><\/a><\/p>\n<div class=\"info\"><strong class=\"label\">Remarque<\/strong><br \/>\nPour en savoir plus sur Camel, vous pouvez lire un <a href=\"https:\/\/manning-content.s3.amazonaws.com\/download\/f\/737b721-0f60-4ba9-bb1f-7a27c4a4532b\/chapter1sample.pdf\" target=\"_blank\" title=\"Apache Camel In Action - Chapter 1\" rel=\"noopener noreferrer\">extrait gratuit  du chapitre 1 du livre \u00ab\u00a0Camel in Action\u00a0\u00bb<\/a>, le livre de r\u00e9f\u00e9rence de ce framework (en anglais).\n<\/div>\n<p>Rapha\u00ebl Delaporte (<a href=\"https:\/\/twitter.com\/rafdelaporte\" target=\"_blank\" title=\"@rafdelaporte\" rel=\"noopener noreferrer\">@rafdelaporte<\/a>) nous a propos\u00e9 de dompter un chameau cette semaine au <a href=\"https:\/\/blog.fabianpiau.com\/fr\/2009\/10\/24\/java-user-group-jug\/\" title=\"JUG\">JUG<\/a> Nantes.<\/p>\n<p style=\"text-align: center;\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" title=\"Photo chameau\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00042\/camel.png?resize=430%2C298&#038;ssl=1\" alt=\"Photo chameau\" width=\"430\" height=\"298\" \/><\/p>\n<p>Et ne vous fiez pas \u00e0 cette photo ! Notre chameau d&rsquo;informaticien n&rsquo;est pas un paresseux, bien au contraire ! Retour sur une pr\u00e9sentation forte int\u00e9ressante d&rsquo;<a href=\"https:\/\/camel.apache.org\/\" target=\"_blank\" title=\"Apache Camel\" rel=\"noopener noreferrer\">Apache Camel<\/a>.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/camel.apache.org\/\" target=\"_blank\" title=\"Apache Camel\" rel=\"noopener noreferrer\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" title=\"Logo Apache Camel\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00042\/apache-camel-logo.png?resize=349%2C171&#038;ssl=1\" alt=\"Logo Apache Camel\" width=\"349\" height=\"171\" \/><\/a><\/p>\n<p><a href=\"https:\/\/camel.apache.org\/\" target=\"_blank\" title=\"Apache Camel\" rel=\"noopener noreferrer\">Apache Camel<\/a> s&rsquo;appuie et reprend les Entreprise Integration Patterns &#8211; EIP (\u00e0 ne pas confondre avec les Design Patterns qui sont utilis\u00e9s pour la conception objet).<\/p>\n<p><br clear=\"none\" \/><\/p>\n<h4>Les patterns EIP<\/h4>\n<p>Voici les principaux patterns du plus simple au plus complexe (extrait de la pr\u00e9sentation).<\/p>\n<div style=\"max-width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00042\/eip-patterns.png?ssl=1\" rel=\"shadowbox[sbpost-772];player=img;\" title=\"Entreprise Integration Patterns\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00042\/eip-patterns-thumbnail.png?resize=550%2C346&#038;ssl=1\" alt=\"Entreprise Integration Patterns\" title=\"Entreprise Integration Patterns\" width=\"550\" height=\"346\" class=\"size-medium wp-image-257\" \/><\/a><p class=\"wp-caption-text\">Entreprise Integration Patterns<\/p><\/div>\n<p>En les combinant, les possibilit\u00e9s sont quasi-infinies. Vous trouverez la <a href=\"https:\/\/camel.apache.org\/components\/eips\/enterprise-integration-patterns.html\" target=\"_blank\" title=\"Liste des Patterns impl\u00e9ment\u00e9s dans Camel\" rel=\"noopener noreferrer\">liste des Patterns impl\u00e9ment\u00e9s dans Camel<\/a> sur le site officiel du framework.<\/p>\n<blockquote><p>Un livre complet sur le sujet existe <a href=\"https:\/\/www.enterpriseintegrationpatterns.com\/\" target=\"_blank\" title=\"Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions\" rel=\"noopener noreferrer\">\u00ab\u00a0Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions\u00a0\u00bb<\/a>. L&rsquo;auteur n&rsquo;est autre que le cr\u00e9ateur de ce concept, autant dire que c&rsquo;est la r\u00e9f\u00e9rence dans ce domaine.<\/p><\/blockquote>\n<p><br clear=\"none\" \/><\/p>\n<h4>Faire des EIP avec Apache Camel<\/h4>\n<p>Pour mettre en oeuvre les EIP, on trouve trois \u00e9l\u00e9ments de base dans Camel :<\/p>\n<ul>\n<li>Route<\/li>\n<li>Processor<\/li>\n<li>Endpoint (dans la litt\u00e9rature fran\u00e7aise, le terme est parfois traduit par \u00ab\u00a0point d&rsquo;extr\u00e9mit\u00e9\u00a0\u00bb)<\/li>\n<\/ul>\n<p>Une <a href=\"https:\/\/camel.apache.org\/manual\/routes.html\" target=\"_blank\" title=\"Camel route\" rel=\"noopener noreferrer\">route<\/a> est conceptualis\u00e9e de la mani\u00e8re suivante : la liaison de deux <a href=\"https:\/\/camel.apache.org\/manual\/endpoint.html\" target=\"_blank\" title=\"Camel endpoint\" rel=\"noopener noreferrer\">endpoints<\/a> par un <a href=\"https:\/\/camel.apache.org\/manual\/processor.html\" target=\"_blank\" title=\"Camel processor\" rel=\"noopener noreferrer\">processor<\/a>. Ainsi, nous avons un endpoint de d\u00e9part et un endpoint de fin, un endpoint est associ\u00e9 \u00e0 une ressource. Une route symbolise un traitement plus ou moins complexe en fonction du traitement voulu (processor) et de l&rsquo;EIP choisi.<\/p>\n<p>Pour r\u00e9pondre au besoin, on peut imbriquer les routes, les chainer, appliquer des traitements diff\u00e9rents tout au long de la route, etc.<br \/>\n<br clear=\"none\" \/><br \/>\nDans Apache Camel, la d\u00e9finition de routes peut se faire de deux mani\u00e8res :<\/p>\n<ul>\n<li>Soit en utilisant le langage Java (domain specific language &#8211; DSL). Apache Camel fournit une API. Tr\u00e8s pratique pour l&rsquo;autocompl\u00e9tion dans l&rsquo;IDE.<\/li>\n<li>Soit en utilisant le langage XML. Plus verbeux donc un peu moins lisible et finalement un peu moins pratique. Avec Camel, on pr\u00e9conise l&rsquo;utilisation du DSL lorsque les routes sont complexes.<\/li>\n<\/ul>\n<p>Dans la suite, nous privil\u00e9gierons donc l&rsquo;\u00e9criture en code Java. Dans tous les cas, un minimum de code XML est n\u00e9cessaire pour la configuration de Camel (le contexte Camel, les sources de donn\u00e9es, etc.).<\/p>\n<p>Voici un exemple de route :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport org.apache.camel.builder.RouteBuilder;\r\n\r\npublic class MyFirstRoute extends RouteBuilder {\r\n    @Override\r\n    public void configure() thwrows Exception {\r\n        \/\/ Ma premi\u00e8re route\r\n        from(&#039;file:\/Users\/fabian\/src&#039;).to(&#039;file:\/Users\/fabian\/dest&#039;).end();\r\n\r\n        \/\/ D&#039;autres routes peuvent \u00eatre d\u00e9finies\r\n        \/\/ ...\r\n    }\r\n}\r\n<\/pre>\n<blockquote><p>Le mot cl\u00e9 <code>.end()<\/code> n&rsquo;est pas obligatoire, mais il est conseill\u00e9 pour bien d\u00e9limiter les routes et permettre de s&rsquo;y retrouver (maintenabilit\u00e9). Dans cet exemple, le traitement est tr\u00e8s simple et il n&rsquo;y a qu&rsquo;une seule route, il n&rsquo;est pas vraiment indispensable.<\/p><\/blockquote>\n<p><br clear=\"none\" \/><br \/>\nLa pr\u00e9sentation \u00e9tait ponctu\u00e9e de nombreuses d\u00e9mos. A partir d&rsquo;un projet Maven bien configur\u00e9 (d\u00e9pendances Spring, Camel, contextes&#8230;), Rapha\u00ebl nous a montr\u00e9 quelques cas d&rsquo;utilisation \u00e9coles :<\/p>\n<ul>\n<li>D\u00e9placer les fichiers d&rsquo;un r\u00e9pertoire \u00e0 un autre (il s&rsquo;agit du bout de code ci-dessus). Tous les fichiers cr\u00e9\u00e9s dans le r\u00e9pertoire <code>src<\/code> seront d\u00e9plac\u00e9s dans le r\u00e9pertoire <code>dest<\/code>. Cette route s&rsquo;\u00e9crit en une ligne, t\u00e9moignant de la puissance d&rsquo;un tel outil.<\/li>\n<li>Cr\u00e9er des fichiers correspondants \u00e0 chaque message pool\u00e9 dans une queue JMS. Pour la pr\u00e9sentation, Rapha\u00ebl a utilis\u00e9 <a href=\"https:\/\/activemq.apache.org\/\" target=\"_blank\" title=\"Apache ActiveMQ\" rel=\"noopener noreferrer\">Apache ActiveMQ<\/a>, un message broker JMS. Ce cas illustre le pattern <a href=\"https:\/\/camel.apache.org\/components\/eips\/split-eip.html\" target=\"_blank\" title=\"Camel splitter\" rel=\"noopener noreferrer\">Splitter<\/a>.<\/li>\n<li>Transf\u00e9rer des messages JMS vers une queue en fonction de leurs contenus. Ce cas illustre le pattern <a href=\"https:\/\/camel.apache.org\/components\/eips\/choice-eip.html\" target=\"_blank\" title=\"Camel content-based Router\" rel=\"noopener noreferrer\">Content-based Router<\/a>.<\/li>\n<p>La route est la suivante, en supposant que <code>queue.in<\/code> existe dans ActiveMQ et qu&rsquo;on y poole des messages :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport org.apache.camel.builder.RouteBuilder;\r\n\r\npublic class MyContentBasedRoute extends RouteBuilder {\r\n    @Override\r\n    public void configure() thwrows Exception {\r\n        from(&#039;amq:queue.in&#039;)\r\n            .choice()\r\n                .when(header(&#039;JMSCorrelationID&#039;).isEqualTo(&#039;nantes&#039;))\r\n                    .to(&#039;amq:queue.nantes&#039;)\r\n                .when(header(&#039;JMSCorrelationID&#039;).isEqualTo(&#039;rennes&#039;))\r\n                    .to(&#039;amq:queue.rennes&#039;)\r\n                .otherwise()\r\n                    .to(&#039;amq:queue.others&#039;)\r\n        .end();\r\n    }\r\n}\r\n<\/pre>\n<p>Depuis la console d&rsquo;admin d&rsquo;ActiveMQ, on cr\u00e9e quelques messages de test avec les diff\u00e9rents cas possibles. En fonction de son header, le message est rout\u00e9 vers la bonne queue.<\/p>\n<p>Il est possible de chainer des pr\u00e9dicats avec les op\u00e9rateurs logiques habituels afin de cr\u00e9er des crit\u00e8res de routage plus complexe. Ici, le pr\u00e9dicat est simple et se base seulement sur le header du message. On aurait pu \u00e9galement se baser sur le body pour faire un routage plus fin des messages.<\/p>\n<li>Cr\u00e9er des messages JMS \u00e0 partir du contenu d&rsquo;un fichier XML. Ce cas illustre le pattern <a href=\"https:\/\/camel.apache.org\/components\/eips\/dynamicRouter-eip.html\" target=\"_blank\" title=\"Camel dynamic Router\" rel=\"noopener noreferrer\">Dynamic Router<\/a>.<\/li>\n<p>Voici le contenu du fichier <code>messages_jug.xml<\/code> :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;jug&gt;\r\n    &lt;nantes&gt;Hello from Nantes&lt;\/nantes&gt;\r\n    &lt;paris&gt;Hello from Paris&lt;\/paris&gt;\r\n    &lt;rennes&gt;Hello from Rennes&lt;\/nantes&gt;\r\n    &lt;nantes&gt;Hello again from Nantes&lt;\/nantes&gt;\r\n    &lt;paris&gt;Hello again from Paris&lt;\/paris&gt;\r\n    &#x5B;...]\r\n&lt;\/jug&gt;\r\n<\/pre>\n<p>Avec Camel, on veut extraire les diff\u00e9rents messages pour les envoyer dans une queue.<\/p>\n<p>Voici le code de la route correspondante :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nimport org.apache.camel.builder.RouteBuilder;\r\n\r\npublic class MyDynamicRoute extends RouteBuilder {\r\n    @Override\r\n    public void configure() thwrows Exception {\r\n        from(&#039;files:\/Users\/fabian\/src\/messages_jug.xml&#039;)\r\n            .split(xpath(&#039;\/jug\/child::*&#039;))\r\n        .to(&#039;amq:queue.jugs&#039;);\r\n    }\r\n}\r\n<\/pre>\n<blockquote><p>On aurait pu router vers un autre fichier en filtrant sur les messages de Nantes. Les possibilit\u00e9s sont multiples.<\/p><\/blockquote>\n<p><br clear=\"none\" \/><\/p>\n<h4>Optimisations Camel<\/h4>\n<p>On peut se poser le probl\u00e8me de l&rsquo;indisponibilit\u00e9&#8230; Que se passe-t&rsquo;il dans le cas du traitement d&rsquo;un message si la machine crashe et n&rsquo;a pas le temps de router le message ? Malheureusement, vous perdez le message ! Celui-ci a \u00e9t\u00e9 consomm\u00e9 dans la queue de d\u00e9part, mais n&rsquo;a jamais pu atteindre sa destination. La solution est de passer la route en mode transactionnel. Cela se fait en ajoutant <code>.transacted()<\/code> juste apr\u00e8s le <code>.from(...)<\/code> et en prenant soin d&rsquo;indiquer \u00e0 votre source JMS de se mettre en mode transactionnel (configuration XML).<\/p>\n<p>On peut aussi noter que, par d\u00e9faut, le traitement est monothread. Une am\u00e9lioration est d&rsquo;activer la parall\u00e9lisation sur le processor (ici <code>split<\/code>) en ajoutant l&rsquo;option <code>.parallelProcessing()<\/code> juste apr\u00e8s le <code>.split(...)<\/code>.<\/p>\n<p>Nous avons parl\u00e9 de <code>file<\/code> et de <code>jms<\/code>, mais les composants disponibles dans Camel sont l\u00e9gion gr\u00e2ce \u00e0 une communaut\u00e9 tr\u00e8s active. Cette  <a href=\"https:\/\/camel.apache.org\/components\/latest\/\" target=\"_blank\" title=\"Ensemble des composants disponibles avec Camel\" rel=\"noopener noreferrer\">page<\/a> recense <a href=\"https:\/\/camel.apache.org\/components\/latest\/\" target=\"_blank\" title=\"Ensemble des composants disponibles avec Camel\" rel=\"noopener noreferrer\">l&rsquo;ensemble des composants disponibles<\/a>. Citons <code>jdbc<\/code>, <code>ftp<\/code>, <code>gmail<\/code>, <code>atom<\/code>, <code>pop<\/code>, <code>imap<\/code> entres autres.<\/p>\n<p><br clear=\"none\" \/><\/p>\n<h4>Faire des EIP avec Spring Integration<\/h4>\n<p>Rapha\u00ebl nous a parl\u00e9 de <a href=\"https:\/\/docs.spring.io\/spring-integration\/reference\/overview.html\" target=\"_blank\" title=\"Spring Integration\" rel=\"noopener noreferrer\">Spring Integration<\/a>, une alternative \u00e0 Camel. <a href=\"https:\/\/docs.spring.io\/spring-integration\/reference\/overview.html\" target=\"_blank\" title=\"Documentation de Spring Integration\" rel=\"noopener noreferrer\">Spring Integration<\/a> ne laisse pas le choix \u00e0 l&rsquo;utilisateur et s&rsquo;utilise avec la notation XML exclusivement.<\/p>\n<p>D&rsquo;apr\u00e8s Rapha\u00ebl, il s&rsquo;int\u00e8gre mieux avec Spring Batch, mais l&rsquo;objectif n&rsquo;\u00e9tait pas de juger les deux outils. Chacun a ses avantages et ses inconv\u00e9nients.<\/p>\n<p>Voici l&rsquo;exemple du transfert des fichiers d&rsquo;un r\u00e9pertoire \u00e0 un autre, cette fois \u00e9crit avec Spring Integration :<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;channel id=&#039;myFirstChannel&#039; \/&gt;\r\n\r\n&lt;file:inbound-channel-adapter id=&#039;filesIn&#039;\r\n        channel=&#039;myFirstChannel&#039;\r\n        directory=&#039;file:\/Users\/fabian\/src&#039; \/&gt;\r\n\r\n&lt;file:outbound-channel-adapter id=&#039;filesOut&#039;\r\n        channel=&#039;myFirstChannel&#039;\r\n        directory=&#039;files:\/Users\/fabian\/dest&#039; \/&gt;\r\n<\/pre>\n<p>La notion de route n&rsquo;est pas pr\u00e9sente, on parle de channel. Une channel relie deux composants. On se rapproche clairement de la philosophie de Spring qui place la notion de composant au centre. Des composants que l&rsquo;on injecte et que l&rsquo;on relie entre eux (et c&rsquo;est logique puisqu&rsquo;il s&rsquo;agit du m\u00eame \u00e9diteur SpringSource).<\/p>\n<blockquote><p>En fait, le terme route n&rsquo;est utilis\u00e9 que par Camel. Spring Integration est plus fid\u00e8le aux concepts des EIP en utilisant des termes similaires comme channel.<\/p><\/blockquote>\n<p>Autre diff\u00e9rence, la channel apparait concr\u00e8tement dans Spring Integration alors que la route dans Camel est implicite (pas de mot-cl\u00e9 <code>route()<\/code>). Si on reprend notre premi\u00e8re route :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nfrom(&#039;file:\/Users\/fabian\/src&#039;).to(&#039;file:\/Users\/fabian\/dest&#039;);\r\n<\/pre>\n<p>La route est symbolis\u00e9e par le \u00ab\u00a0.\u00a0\u00bb entre les deux endpoints. Il n&rsquo;est pas possible de la configuer. A ce niveau, Spring Integration est un peu plus pouss\u00e9 avec la possibilit\u00e9 de configurer le type de channel notamment.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre \u00ab\u00a0Camel in Action\u00a0\u00bb, le livre de r\u00e9f\u00e9rence de ce framework (en anglais). Rapha\u00ebl Delaporte (@rafdelaporte) nous a propos\u00e9 de dompter un chameau cette semaine au JUG Nantes. Et ne vous fiez pas \u00e0 cette [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1386,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[152,153,154,51],"class_list":["post-772","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agile-programming","tag-camel","tag-eip","tag-entreprise-integration-pattern","tag-jug"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Une premi\u00e8re approche du Camel d&#039;Apache | CarmaBlog<\/title>\n<meta name=\"description\" content=\"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre &quot;Camel in Action&quot;, le\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Une premi\u00e8re approche du Camel d&#039;Apache | CarmaBlog\" \/>\n<meta property=\"og:description\" content=\"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre &quot;Camel in Action&quot;, le\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/\" \/>\n<meta property=\"og:site_name\" content=\"CarmaBlog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/fabian.piau\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/fabian.piau\" \/>\n<meta property=\"article:published_time\" content=\"2012-05-11T07:05:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-30T14:47:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"279\" \/>\n\t<meta property=\"og:image:height\" content=\"279\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Fabian Piau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fabianpiau\" \/>\n<meta name=\"twitter:site\" content=\"@fabianpiau\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fabian Piau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/\"},\"author\":{\"name\":\"Fabian Piau\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"headline\":\"Une premi\u00e8re approche du Camel d&rsquo;Apache\",\"datePublished\":\"2012-05-11T07:05:09+00:00\",\"dateModified\":\"2024-12-30T14:47:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/\"},\"wordCount\":2685,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2012\\\/05\\\/00042.jpg?fit=279%2C279&ssl=1\",\"keywords\":[\"camel\",\"eip\",\"entreprise integration pattern\",\"jug\"],\"articleSection\":[\"Programmation agile\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/\",\"url\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/\",\"name\":\"Une premi\u00e8re approche du Camel d'Apache | CarmaBlog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2012\\\/05\\\/00042.jpg?fit=279%2C279&ssl=1\",\"datePublished\":\"2012-05-11T07:05:09+00:00\",\"dateModified\":\"2024-12-30T14:47:59+00:00\",\"description\":\"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre \\\"Camel in Action\\\", le\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/\"]]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2012\\\/05\\\/00042.jpg?fit=279%2C279&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2012\\\/05\\\/00042.jpg?fit=279%2C279&ssl=1\",\"width\":279,\"height\":279,\"caption\":\"Apache Camel\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2012\\\/05\\\/11\\\/first-steps-with-apache-camel\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Homepage\",\"item\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programmation agile\",\"item\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/category\\\/agile-programming\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"First steps with Apache Camel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/\",\"name\":\"CarmaBlog\",\"description\":\"Agilit\u00e9, D\u00e9veloppement Java, Nouvelles technologies et plus...\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\",\"name\":\"Fabian Piau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"width\":567,\"height\":667,\"caption\":\"Fabian Piau\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\"},\"description\":\"D\u00e9veloppeur Java, Fabian s'int\u00e9resse aux nouvelles technologies et plus particuli\u00e8rement \u00e0 leur utilisation dans un contexte agile.\",\"sameAs\":[\"https:\\\/\\\/blog.fabianpiau.com\",\"https:\\\/\\\/www.facebook.com\\\/fabian.piau\",\"https:\\\/\\\/www.instagram.com\\\/fabianpiau\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/fabianpiau\\\/\",\"https:\\\/\\\/x.com\\\/fabianpiau\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Une premi\u00e8re approche du Camel d'Apache | CarmaBlog","description":"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre \"Camel in Action\", le","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/","og_locale":"fr_FR","og_type":"article","og_title":"Une premi\u00e8re approche du Camel d'Apache | CarmaBlog","og_description":"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre \"Camel in Action\", le","og_url":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/","og_site_name":"CarmaBlog","article_publisher":"https:\/\/www.facebook.com\/fabian.piau","article_author":"https:\/\/www.facebook.com\/fabian.piau","article_published_time":"2012-05-11T07:05:09+00:00","article_modified_time":"2024-12-30T14:47:59+00:00","og_image":[{"width":279,"height":279,"url":"https:\/\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg","type":"image\/jpeg"}],"author":"Fabian Piau","twitter_card":"summary_large_image","twitter_creator":"@fabianpiau","twitter_site":"@fabianpiau","twitter_misc":{"\u00c9crit par":"Fabian Piau","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/#article","isPartOf":{"@id":"https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/"},"author":{"name":"Fabian Piau","@id":"https:\/\/blog.fabianpiau.com\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"headline":"Une premi\u00e8re approche du Camel d&rsquo;Apache","datePublished":"2012-05-11T07:05:09+00:00","dateModified":"2024-12-30T14:47:59+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/"},"wordCount":2685,"commentCount":3,"publisher":{"@id":"https:\/\/blog.fabianpiau.com\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"image":{"@id":"https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg?fit=279%2C279&ssl=1","keywords":["camel","eip","entreprise integration pattern","jug"],"articleSection":["Programmation agile"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/","url":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/","name":"Une premi\u00e8re approche du Camel d'Apache | CarmaBlog","isPartOf":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/#primaryimage"},"image":{"@id":"https:\/\/blog.fabianpiau.com\/2012\/05\/11\/first-steps-with-apache-camel\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg?fit=279%2C279&ssl=1","datePublished":"2012-05-11T07:05:09+00:00","dateModified":"2024-12-30T14:47:59+00:00","description":"&nbsp;English version available Remarque Pour en savoir plus sur Camel, vous pouvez lire un extrait gratuit du chapitre 1 du livre \"Camel in Action\", le","breadcrumb":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/"]]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/#primaryimage","url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg?fit=279%2C279&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg?fit=279%2C279&ssl=1","width":279,"height":279,"caption":"Apache Camel"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.fabianpiau.com\/fr\/2012\/05\/11\/first-steps-with-apache-camel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Homepage","item":"https:\/\/blog.fabianpiau.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Programmation agile","item":"https:\/\/blog.fabianpiau.com\/fr\/category\/agile-programming\/"},{"@type":"ListItem","position":3,"name":"First steps with Apache Camel"}]},{"@type":"WebSite","@id":"https:\/\/blog.fabianpiau.com\/fr\/#website","url":"https:\/\/blog.fabianpiau.com\/fr\/","name":"CarmaBlog","description":"Agilit\u00e9, D\u00e9veloppement Java, Nouvelles technologies et plus...","publisher":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.fabianpiau.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/blog.fabianpiau.com\/fr\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14","name":"Fabian Piau","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","width":567,"height":667,"caption":"Fabian Piau"},"logo":{"@id":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1"},"description":"D\u00e9veloppeur Java, Fabian s'int\u00e9resse aux nouvelles technologies et plus particuli\u00e8rement \u00e0 leur utilisation dans un contexte agile.","sameAs":["https:\/\/blog.fabianpiau.com","https:\/\/www.facebook.com\/fabian.piau","https:\/\/www.instagram.com\/fabianpiau\/","https:\/\/www.linkedin.com\/in\/fabianpiau\/","https:\/\/x.com\/fabianpiau"]}]}},"views":14008,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2012\/05\/00042.jpg?fit=279%2C279&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbSHyl-cs","_links":{"self":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts\/772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/comments?post=772"}],"version-history":[{"count":0,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts\/772\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/media\/1386"}],"wp:attachment":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/media?parent=772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/categories?post=772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/tags?post=772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}