CarmaBlog

Agilité, Développement Java, Nouvelles technologies et plus…
  • rss
  • Accueil
  • Management
  • Programmation agile
  • Technologie
  • Linux
  • Evénement
  • Contact
  • A propos de l'auteur
  • English
  • Francais

Une première approche du Camel d’Apache

Fabian Piau | 11 mai 2012 - 09:05 | 67 vues


Raphaël Delaporte (@rafdelaporte) nous a proposé de dompter un chameau cette semaine au JUG Nantes.

Photo chameau

Et ne vous fiez pas à cette photo ! Notre chameau d’informaticien n’est pas un paresseux, bien au contraire ! Retour sur une présentation forte intéressante d’Apache Camel.

Logo Apache Camel

Apache Camel s’appuie et reprend les Entreprise Integration Patterns – EIP (à ne pas confondre avec les Design Patterns qui sont utilisés pour la conception objet).


Les patterns EIP

Voici les principaux patterns du plus simple au plus complexe (extrait de la présentation).

Entreprise Integration Patterns

Entreprise Integration Patterns

En les combinant, les possibilités sont quasi-infinies. Vous trouverez la liste des Patterns implémentés dans Camel sur le site officiel du framework.

Un livre complet sur le sujet existe « Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions ». L’auteur n’est autre que le créateur de ce concept, autant dire que c’est la référence dans ce domaine.


Faire des EIP avec Apache Camel

Pour mettre en oeuvre les EIP, on trouve trois éléments de base dans Camel :

  • Route
  • Processor
  • Endpoint (dans la littérature française, le terme est parfois traduit par « point d’extrémité »)

Une route est conceptualisée de la manière suivante : la liaison de deux endpoints par un processor. Ainsi, nous avons un endpoint de départ et un endpoint de fin, un endpoint est associé à une ressource. Une route symbolise un traitement plus ou moins complexe en fonction du traitement voulu (processor) et de l’EIP choisi.

Pour répondre au besoin, on peut imbriquer les routes, les chainer, appliquer des traitements différents tout au long de la route, etc.


Dans Apache Camel, la définition de routes peut se faire de deux manières :

  • Soit en utilisant le langage Java (domain specific language – DSL). Apache Camel fournit une API. Très pratique pour l’autocomplétion dans l’IDE.
  • Soit en utilisant le langage XML. Plus verbeux donc un peu moins lisible et finalement un peu moins pratique. Avec Camel, on préconise l’utilisation du DSL lorsque les routes sont complexes.

Dans la suite, nous privilégierons donc l’écriture en code Java. Dans tous les cas, un minimum de code XML est nécessaire pour la configuration de Camel (le contexte Camel, les sources de données, etc.).

Voici un exemple de route :

import org.apache.camel.builder.RouteBuilder;

public class MyFirstRoute extends RouteBuilder {
    @Override
    public void configure() thwrows Exception {
        // Ma première route
        from("file:/Users/fabian/src").to("file:/Users/fabian/dest").end();

        // D'autres routes peuvent être définies
        // ...
    }
}

Le mot clé .end() n’est pas obligatoire, mais il est conseillé pour bien délimiter les routes et permettre de s’y retrouver (maintenabilité). Dans cet exemple, le traitement est très simple et il n’y a qu’une seule route, il n’est pas vraiment indispensable.



La présentation était ponctuée de nombreuses démos. A partir d’un projet Maven bien configuré (dépendances Spring, Camel, contextes…), Raphaël nous a montré quelques cas d’utilisation écoles :

  • Déplacer les fichiers d’un répertoire à un autre (il s’agit du bout de code ci-dessus). Tous les fichiers créés dans le répertoire src seront déplacés dans le répertoire dest. Cette route s’écrit en une ligne, témoignant de la puissance d’un tel outil.
  • Créer des fichiers correspondants à chaque message poolé dans une queue JMS. Pour la présentation, Raphaël a utilisé Apache ActiveMQ, un message broker JMS. Ce cas illustre le pattern Splitter.
  • Transférer des messages JMS vers une queue en fonction de leurs contenus. Ce cas illustre le pattern Content-based Router.
  • La route est la suivante, en supposant que queue.in existe dans ActiveMQ et qu’on y poole des messages :

    import org.apache.camel.builder.RouteBuilder;
    
    public class MyContentBasedRoute extends RouteBuilder {
        @Override
        public void configure() thwrows Exception {
            from("amq:queue.in")
                .choice()
                    .when(header("JMSCorrelationID").isEqualTo("nantes"))
                        .to("amq:queue.nantes")
                    .when(header("JMSCorrelationID").isEqualTo("rennes"))
                        .to("amq:queue.rennes")
                    .otherwise()
                        .to("amq:queue.others")
            .end();
        }
    }
    

    Depuis la console d’admin d’ActiveMQ, on crée quelques messages de test avec les différents cas possibles. En fonction de son header, le message est routé vers la bonne queue.

    Il est possible de chainer des prédicats avec les opérateurs logiques habituels afin de créer des critères de routage plus complexe. Ici, le prédicat est simple et se base seulement sur le header du message. On aurait pu également se baser sur le body pour faire un routage plus fin des messages.

  • Créer des messages JMS à partir du contenu d’un fichier XML. Ce cas illustre le pattern Dynamic Router.
  • Voici le contenu du fichier messages_jug.xml :

    <jug>
        <nantes>Hello from Nantes</nantes>
        <paris>Hello from Paris</paris>
        <rennes>Hello from Rennes</nantes>
        <nantes>Hello again from Nantes</nantes>
        <paris>Hello again from Paris</paris>
        [...]
    </jug>
    

    Avec Camel, on veut extraire les différents messages pour les envoyer dans une queue.

    Voici le code de la route correspondante :

    import org.apache.camel.builder.RouteBuilder;
    
    public class MyDynamicRoute extends RouteBuilder {
        @Override
        public void configure() thwrows Exception {
            from("files:/Users/fabian/src/messages_jug.xml")
                .split(xpath("/jug/child::*"))
            .to("amq:queue.jugs");
        }
    }
    

    On aurait pu router vers un autre fichier en filtrant sur les messages de Nantes. Les possibilités sont multiples.


    Optimisations Camel

    On peut se poser le problème de l’indisponibilité… Que se passe-t’il dans le cas du traitement d’un message si la machine crashe et n’a pas le temps de router le message ? Malheureusement, vous perdez le message ! Celui-ci a été consommé dans la queue de départ, mais n’a jamais pu atteindre sa destination. La solution est de passer la route en mode transactionnel. Cela se fait en ajoutant .transacted() juste après le .from(...) et en prenant soin d’indiquer à votre source JMS de se mettre en mode transactionnel (configuration XML).

    On peut aussi noter que, par défaut, le traitement est monothread. Une amélioration est d’activer la parallélisation sur le processor (ici split) en ajoutant l’option .parallelProcessing() juste après le .split(...).

    Nous avons parlé de file et de jms, mais les composants disponibles dans Camel sont légion grâce à une communauté très active. Cette page recense l’ensemble des composants disponibles. Citons jdbc, ftp, gmail, atom, pop, imap entres autres.


    Faire des EIP avec Spring Integration

    Raphaël nous a parlé de Spring Integration, une alternative à Camel. Spring Integration ne laisse pas le choix à l’utilisateur et s’utilise avec la notation XML exclusivement.

    D’après Raphaël, il s’intègre mieux avec Spring Batch, mais l’objectif n’était pas de juger les deux outils. Chacun a ses avantages et ses inconvénients.

    Voici l’exemple du transfert des fichiers d’un répertoire à un autre, cette fois écrit avec Spring Integration :

    <channel id="myFirstChannel" />
    
    <file:inbound-channel-adapter id="filesIn"
            channel="myFirstChannel"
            directory="file:/Users/fabian/src" />
    
    <file:outbound-channel-adapter id="filesOut"
            channel="myFirstChannel"
            directory="files:/Users/fabian/dest" />
    

    La notion de route n’est pas présente, 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’on injecte et que l’on relie entre eux (et c’est logique puisqu’il s’agit du même éditeur SpringSource).

    En fait, le terme route n’est utilisé que par Camel. Spring Integration est plus fidèle aux concepts des EIP en utilisant des termes similaires comme channel.

    Autre différence, la channel apparait concrètement dans Spring Integration alors que la route dans Camel est implicite (pas de mot-clé route()). Si on reprend notre première route :

    from("file:/Users/fabian/src").to("file:/Users/fabian/dest");
    

    La route est symbolisée par le « . » entre les deux endpoints. Il n’est pas possible de la configuer. A ce niveau, Spring Integration est un peu plus poussé avec la possibilité de configurer le type de channel notamment.

    Filmée lors d’un BreizhJUG, cette présentation est disponible sur Parleys.

Commentaires
Pas de Commentaires »
Catégories
Programmation agile
Tags
camel, eip, entreprise integration pattern, jug
Flux rss des commentaires Flux rss des commentaires
Trackback Trackback

Ce fichier est actuellement utilisé, vous ne pouvez rien y faire… Merci Windows !

Fabian Piau | 22 avril 2012 - 18:48 | 173 vues


Utilisateur de Windows, n’avez-vous jamais eu de difficulté pour supprimer ou renommer un fichier ou un dossier ?

Suppression impossible

N’avez-vous jamais eu un message vous indiquant que vous ne pouvez pas éjecter votre clé USB ou votre disque dur externe ?

Ejection impossible

Si non, alors vous êtes un utilisateur vraiment chanceux. Si oui, un utilisateur normal… et voici la solution : Unlocker.

Logo Unlocker

Un clic droit sur le fichier ou le dossier verouillé pour obtenir la liste des processus / application l’utilisant.

Menu contextuel Unlocker

Un autre clic pour le libérer, rien de plus simple !

Liste des verrous

Gratuit et léger, vous pouvez télécharger ce petit utilitaire sur le site officiel, disponible pour Windows XP, Vista et 7 en version 32 ou 64 bits.

Veuillez noter que votre antivirus peut voir l’installateur d’Unlocker comme un virus, ignorer le message, c’est un comportement normal.

Commentaires
Pas de Commentaires »
Catégories
Technologie
Tags
unlock, unlocker, windows
Flux rss des commentaires Flux rss des commentaires
Trackback Trackback

Personnaliser Gnome 3 (Shell)

Fabian Piau | 15 mars 2012 - 01:01 | 605 vues


J’utilise la distribution Ubuntu depuis plusieurs années déjà, et comme beaucoup d’utilisateurs, je suis passé de Gnome 2 à Ubuntu Unity pour le gestionnaire de bureau. Plein de bonnes idées (très adapté pour les netbooks notamment), Unity ne m’a pourtant jamais vraiment convaincu, et je regrettais mon bon vieux bureau sous Gnome 2.

Après plusieurs mois sous Unity, j’ai décidé de tester Gnome 3, sorti vers le milieu de l’année 2011.

Logo Gnome

Après l’installation de Gnome 3 et de son interface Shell, j’ai eu la bonne surprise de voir que les développeurs ont repris pas mal de bonnes idées à Unity, à moins que ça ne soit l’inverse… Mieux, je le trouve plus réactif et encore plus ergonomique. Petit bémol, le design est un peu léger surtout face à Unity.

Gnome Shell demande une petite personnalisation pour être parfait. Voici donc la recette pour obtenir un environnement joli et fonctionnel en moins d’une heure !

Screenshot 1

Après la personnalisation

La suite suppose que vous ayez Gnome Shell installé.

  1. Ajouter ce PPA non officiel, il contient tout ce qu’il faut pour personnaliser Gnome 3/Gnome Shell.
    sudo add-apt-repository ppa:webupd8team/gnome3
    sudo apt-get update
  2. Installer Gnome Tweak Tool. C’est le logiciel de base, indispensable pour personnaliser Gnome 3 (afficher les boutons dans la barre des fenêtres, changer le thème, etc.).
    sudo apt-get install gnome-tweak-tool
  3. Ajouter l’extension user-theme (elle débloque une option de Gnome Tweak Tool pour changer le thème de Gnome Shell).
    sudo apt-get install gnome-shell-extensions-user-theme
  4. Télécharger et installer le thème Zukitwo.
    cd ~/.themes
    wget deviantart.com/download/203936861/zukitwo_by_lassekongo83-d3df2ot.zip
    unzip zukitwo*.zip && rm -f zukitwo*.zip
  5. Installer le pack d’icônes Faenza.
    sudo add-apt-repository ppa:tiheum/equinox
    sudo apt-get update
    sudo apt-get install faenza-icon-theme
  6. Lancer Gnome Tweak Tool et configurer comme suit :
    Configuration du thème

    Configuration du thème

    La barre en haut du thème Zukitwo est transparente faisant apparaitre une horrible barre en dessous. Si c’est aussi votre cas, une petite désinstallation de l’ancien menu global s’impose.

    sudo apt-get autoremove appmenu-gtk appmenu-gtk3 appmenu-qt
  7. Ajouter les extensions Gnome Shell suivantes :
    Gnome Shell est basé sur CSS. Un clic depuis le site web suffit pour activer/désactiver une extension, un vrai bonheur !

    • Alternative Status Menu : ajoute des entrées dans le menu comme éteindre…
    • Analog Clock : affiche l’heure dans un cadran analogique.
    • Applications Menu : ajoute un menu pour lancer les applications comme sous Gnome 2.
    • Battery Percentage Indicator : ajoute le pourcentage à côté de la batterie.
    • Bluetooth icon remover : enlève l’indicateur du Bluetooth.
    • Dock : ajoute un dock.

      Pour mettre le dock à gauche, il faut modifier un fichier javascript (et oui !).
      Ouvrir le fichier « .local/share/gnome-shell/extensions/dock@gnome-shell-extensions.gcampax.github.com/extension.js » et remplacer la ligne 44 « const DOCK_POSITION = PositionMode.RIGHT; » par « const DOCK_POSITION = PositionMode.LEFT; » .

    • Extended Volume Indicator : ajoute des fonctionnalités au menu volume pour contrôler le son des différentes applications.
    • Media player indicator : ajoute une icône pour contrôler votre lecteur multimédia.
    • NetSpeed : ajoute un indicateur sur la vitesse de téléchargement.
    • Places Status Indicator : ajoute un menu pour naviguer rapidement dans le système.
    • Remove Accesibility : enlève l’indicateur d’accessibilité.
    • Show Desktop Button : ajoute une icône pour afficher le bureau.
    • Shutdown Timer : ajoute une fonctionnalité de timer (arrêt de la machine au bout de x minutes).
    • System Monitor : ajoute des indicateurs pour monitorer l’activité du disque et du processeur.
    • Trash : ajoute une icône corbeille.
    • Weather indicator : ajoute un indicateur sur la météo.

      Je n’ai pas réussi à trouver l’extension sur le site, mais une ligne de commande suffira.

      sudo apt-get install gnome-shell-extensions-weather

      Pour afficher la météo de votre ville, il faut configurer le WOEID (Where on Earth IDentifier).
      Vous pouvez l’obtenir en allant sur le site weather.yahoo.com. Chercher votre ville, cliquer sur le flux RSS et récupérer le code depuis l’URL. Par exemple : pour Nantes, l’URL du flux RSS est http://weather.yahooapis.com/forecastrss?p=FRXX0072&u=f d’où le WOEID à utiliser : FRXX0072.

  8. Etant adepte des lanceurs d’applications (cf. mon article sur Launchy pour Windows), j’utilise désormais Synapse sous Linux.
    sudo add-apt-repository ppa:synapse-core/ppa
    sudo apt-get update
    sudo apt-get install synapse

    Pour avoir une couleur noire qui s’adapte au thème Zukitwo-dark, il faut ajouter ce fichier gtkrc dans le dossier ~/.config/synapse/.

  9. Pour peaufiner l’interface, vous pouvez installer Conky pour afficher la date et quelques paramètres supplémentaires sur le bureau (l’exemple est repris de tux-planet).
    sudo apt-get install conky-all ttf-ubuntu-font-family
    wget -O ~/.conkyrc www.tux-planet.fr/public/conf/conky/conky-gotham
    conky

    N’oubliez pas de mettre Conky en lancement au démarrage.

  10. Si vous utilisez Firefox, ajoutez ce personas pour améliorer la compatibilité avec le thème Zukitwo.
  11. Petite touche finale, vous pouvez télécharger le fond d’écran que j’utilise (2560 x 1600). Il s’agit du fond d’écran Leopard d’Apple.
  12. Pour vous donner une meilleure idée du rendu final, voici d’autres copies d’écran.

    Screenshot 2

    Après la personnalisation - 2

    Screenshot 3

    Après la personnalisation - 3

    Screenshot 4

    Après la personnalisation - 4

Commentaires
Pas de Commentaires »
Catégories
Linux
Tags
faenza, gnome, gnome shell, ubuntu, zukitwo
Flux rss des commentaires Flux rss des commentaires
Trackback Trackback
Page 1 sur 1412345…10…»Dernière page

Langue

  • Français
  • English

Articles les plus consultés

  • Extensions WordPress de CarmaBlog - 853 vues
  • Java EE & CDI vs. Spring - 783 vues
  • Changer la langue de Firefox - 608 vues
  • Personnaliser Gnome 3 (Shell) - 605 vues
  • Changer le splash screen d’Eclipse en quelques secondes - 511 vues
  • Barre de progression sur des dates avec JQuery - 435 vues
  • Développement Dirigé par les Tests - 423 vues

Articles récents

  • Une première approche du Camel d’Apache
  • Ce fichier est actuellement utilisé, vous ne pouvez rien y faire… Merci Windows !
  • Personnaliser Gnome 3 (Shell)
  • Offrez un petit coup de jeune à votre application
  • Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR & Co.
  • Votre avatar global avec Gravatar
  • Changer le splash screen d’Eclipse en quelques secondes
  • HTML5, en route pour l’ère du Web 3.0 ?
  • Liste de blogs
  • Java EE & CDI vs. Spring
  • Changer la langue de Firefox
  • jQuery et Ajax
  • Gagner de l’espace disque avec Chrome / Chromium (ou comment ne pas en perdre…)
  • Emmener vos fichiers partout avec vous grâce à Dropbox
  • Barre de progression sur des dates avec JQuery

Twitter @fabianpiau

  • RT @romainguefveneu: En cas de problème avec une #appli, contactez d'abord le développeur, et s'il ne fait rien alors vous pourrez râler ... - 1 week ago
  • New post: Une première approche du Camel d'Apache goo.gl/3yar9 - 1 week ago
  • Les #geeks vaincront ! #arte videos.arte.tv/fr/videos/la_r… - 2 weeks ago
  • This file is currently used, you cannot do anything... Thanks you Windows ! Try Unlocker ! blog.fabianpiau.com/en/2012/04/22/… - 3 weeks ago
  • GIT - petit guide! rogerdudler.github.com/git-guide/inde… - 1 month ago
  • L'intégration continue adaptée aux tests de performance bit.ly/Hz0Tce - 1 month ago
  • 8 bits... Google is back to the roots!! youtube.com/watch?v=rznYif… - 1 month ago
  • RT @nantesgtug: N'oubliez pas 10/04, #Google est à #Nantes pour parler de #dart nouv langage web et des apps mobiles avec #Youtube api h ... - 1 month ago
  • My Google Maps Quest for next week ;) http://t.co/DV7SyhDT - 1 month ago
  • Build nice "zoom" presentations with #Prezi : prezi.com - 1 month ago

Mots-clefs

.net agile agility agilité automation automatisation bash build C# chrome ci cloud continuous integration disque dur démonter eclipse eject extension extreme programming firefox google hard drive intégration continue java jquery jug mobile computing mobilité informatique nantes outil partage plugin script sharing tdd test test IHM test unitaire tool ubuntu unit test unmount watin wave éjecter

Flux RSS

RSS Feed RSS - Articles

RSS Feed RSS - Commentaires

Saisissez votre adresse email pour être informé des nouveaux articles.

Liens

  • Agile Nantes
  • Blog Ippon Technologies
  • Blog Netapsys
  • Blog Xebia France
  • Blog Zenika
  • Developpef
  • Le Touilleur Express
  • Les Cast Codeurs Podcast
  • new Blog( perso );
  • OCTO talks !
  • The Coder's Breakfast

Archives

  • Mai 2012 (1)
  • Avril 2012 (1)
  • Mars 2012 (1)
  • Février 2012 (1)
  • Janvier 2012 (2)
  • Décembre 2011 (1)
  • Novembre 2011 (2)
  • Octobre 2011 (2)
  • Septembre 2011 (1)
  • Juillet 2011 (1)
  • Juin 2011 (2)
  • Avril 2011 (1)
  • Mars 2011 (1)
  • Février 2011 (1)
  • Janvier 2011 (2)
  • Novembre 2010 (2)
  • Septembre 2010 (1)
  • Août 2010 (1)
  • Juillet 2010 (1)
  • Juin 2010 (1)
  • Mai 2010 (1)
  • Avril 2010 (1)
  • Mars 2010 (1)
  • Février 2010 (1)
  • Décembre 2009 (1)
  • Novembre 2009 (1)
  • Octobre 2009 (2)
  • Septembre 2009 (2)
  • Août 2009 (3)
  • Juillet 2009 (1)
  • Juin 2009 (2)
rss Flux rss des commentaires get firefox
Fabian Piau | Copyright © 2009 - 2012
Tous droits réservés | Haut ↑