Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes réactives et architectures modulaires Java Discussion :

[Apache Camel] MongoDB product A vers product B


Sujet :

Plateformes réactives et architectures modulaires Java

  1. #1
    Futur Membre du Club
    [Apache Camel] MongoDB product A vers product B
    Bonjour,

    Je souhaiterais avoir l'avis d'expert pour savoir s'il est intéressant d’implémenter Apache Camel dans le cadre de mon projet. J'ai vu plusieurs tutoriaux cependant je remarque qu'Apache Camel propose énormément de feature. Et j'ai doute sur la bonne compréhension de l'utilisation de ce "framework".

    Pour faire très simple :

    Objectif mapper table produit source -> table produit cible

    -> En entrant j'ai une base de données produit(mongodb)
    -> Une table rule qui contient plusieurs règles de mapping, règle de calcul
    Ces règles sont créés par l'utilisateur via une interface web
    -> En sortit la table produit cible formaté en fonction des différentes règles

    Les règles peuvent être
    règle de calcul : stock>0, quantite = quantite - 3
    règle de mapping de champs, exemple produit/name = produit/titre, etc...

    Donc l'idée de l'utilisation d'Apache Camel serait de réaliser tout le processus de mapping, etc..

    Ma première question est simple :est ce que Apache Camel peut m'aider à réaliser ce type de process, où dois je m'orienter vers un solution maison?

  2. #2
    Expert éminent
    Bonjour

    Je ne saisis pas bien le but de votre projet, mais je peux vous éclairer sur ce que permet de faire camel.

    camel est un framework qui permet de définir des routes. Celles-ci sont soit actives en permanence, soit démarrées à la demande.

    Une route est à voir comme une tuyauterie. Un flux de donnée entre d’un côté et sort de l’autre. il est possible dans une route d’appliquer des transformations au flux de donnée (conversion de format, enrichissement, filtrage, etc.)
    Il est possible de définir des points d’entrée et de sorties et de mettre en place des mécanismes de diffusion de routage de split et distribution.

    Il existe un ensemble de design pattrens pour l’intégration de donnée dans l’entreprise. camel fourni les brique pour les implémenter.

    Exemple d’utilisation.
    l’application RH exporte tous les soirs la liste des employés avec leur affectation au format texte csv
    l’annuaire de l’entreprise doit être mis à jour avec ces données, mais ne sait lire que du XML
    Enfin l’application logistique contient une table des personnes habilitées qui doit être mise à jour avec les informations RH pour les personnes qui dont l’affectation est le département logistique.

    camel permet de définir une route qui va lire le fichier produit par l’application RH
    cette route va se poursuivre avec un parseur csv (bindy par exemple)
    les données parsées vont être donné à un sérialiseur XML (jaxb)
    et transmise à un diffuseur qui va en envoyer une copie à l’annuaire et une autre à un filtre qui ne retiendra que les employés dont l’affectation est le département logistique
    Le filtre appliqué les données restantes font être persisté (jpa) dans la base logistique.

    L’export de la base RH ayant lieu tous les soirs cette route est placée dans un exécutable java qui est démarrée tous les soirs après l’export.


    Dans le même ordre d’idée l’application gestion comptable doit être tenue à jour des données RH en temps quasi réel. Elle met à disposition un web service qui permet d’ajouter ou supprimer des personnes. L’application RH elle contient une table de toutes les modifs sur une personne création, changement d’affectation, surpression.

    Avec camel on va créer une route qui lit cette table et qui invoque la méthode correspondante du web service. Cette route est placée dans un exe qui tourne en permanence. Ainsi lorsqu’une opération est faite dans l’application RH la route la transmet à l’application comptable.

    de la même façon on peut faire en sorte, que l’application comptable prenne connaissance des commandes des livraisons, des mouvements de stock faits dans l’appli logistique


    Les routes camel vont permettre de se brancher sur toute source de données de l’entreprise les diffuser et/ou les router vers les autres applications tout en les adaptant à chacune.

    Le but est d’avoir un SI qui se comporte comme s’il n’y avait qu’une application qui prenne tout en charge alors que le SI est fait d’applications qui au départ ne sont pas faites pour communiquer entre elles. Bref avoir un SI tout intégré. d’où le terme de EIP Entreprise Integration Patterns

    A+JYT

  3. #3
    Futur Membre du Club
    Merci
    Tout d'abord un grand MERCI pour tes explications, cela m'éclaire vraiment sur l'utilité pour mon projet.

    Dans le deuxième exemple, la route est définit comme permanente.
    En gros c'est un thread qui tourne toutes les n seconde?
    En pratique quels sont les méthodes pour "commander" ces routes(manuel, webservice, quartz, event)?

    Vraiment Merci pour le temps consacrer.

  4. #4
    Expert éminent
    Il existe deux types de point d’entre event driven et polling

    Suivant le protocole utiliser c’est l’un ou l’autre.
    Par exemple si tu exposes un webservice qui est un point d’entre d’une route il ne peut qu’être de type event drivent. En effet c’est le client qui invoque le service quand il veut.
    Pour ftp un serveur ftp ne peut pas t’envoyer d’information. C’est donc la route qui doit périodiquement scanner le dossier du serveur. Il est donc de type polling. Le paramétrage du connecteur te permet de spécifier la période.

    Par défaut toute route camel est permanente. Camel gère seul le multithreading et tu n’as pas à t’en préoccuper.

    Camel défini des contextes qui contiennent des routes. Lorsque tu démarres un contexte, il démarre toutes les routes de celui-ci si tu ne fais rien de particulier, les routes vont tourner en permanence.

    Pour faire une route que tu exécutes qu’une foi, il te faut ruser un peut. Tu définis un indicateur de fin de traitement que tu mets à false au lancement de ton appli. Puis tu démarres la route. Dans le design de la route, tu ajoutes à la fin de celle-ci la mise à jour de l’indicateur (comme quoi tu as traité toutes les données). Il suffit d’avoir une tache périodique qui attend que l’indicateur de traitement passe à true et qui alors arrête le contexte.

    En creusant plus avant les capacités de camel tu trouveras la notion de bus de commande dans servicemix. Avec ça, c’est plus simple lorsque ta route est finie, elle envoie un événement dans le bus qui arrête la route.

    Mais par défaut, un traitement dans une route camel ne peut pas arrêter la route.

    A+JYT

  5. #5
    Futur Membre du Club
    passons maintenant à la pratique!
    Merci Sekaijin,
    je vais passer maintenant à la pratique.
    Je pense que je vais devoir réaliser plusieurs routes pour mon projet.
    Je vais commencer par celle-ci(simple) :
    Alimenter une base de données produit à partir d'un flux ecommerce distant
    source : http://www.ecommercedistant.com/products.xml
    destination : base de donnée mongodb
    J'avais déjà créé un sérialisateur du flux xml directement au format BSON via SAX pour une alimentation plus rapide, je vais voir comment je peux implémenter tout ca avec Camel. Pour information j'utilise KARAF.

  6. #6
    Membre émérite
    Salut,


    Je suis pas sur de comprendre l’intérêt de Camel pour ton usecase.


    Ton besoin ressemble plus à ce que fais un ETL, alors que Camel (ou autres ESB ou outils d'EIP) sont plus orientés événements.

    Après je me trompe peut-être mais à ta place je regarderai plutôt du coté de Spring Batch, voir de Talend (connais pas plus que ça).

    SpringBatch s'intègre bien avec MongoDB.

    Ca permet de faire ce que tu veux: a savoir avoir une table en input A et sortir une table en input B en fonction de règles métiers dynamiques.


    Le seul truc a définir est: comment doit se lancer ton batch?
    Pour ce faire tu peux très bien utiliser Camel ou Spring Integration pour recevoir une notification.


    Chez nous on a des queues RabbitMQ qui recoivent des notifications traitées par Spring Integration qui déclenchent des jobs SpringBatch et ça marche très bien
    Développeur certifié: Java 6 - Scala - Machine Learning

    Liste verte des SSII humaines, pour passionnés de technique, essentiellement Java mais aussi C#, NoSQL, Scala, JS: Octo, Zenika, Xebia, So@t, Arolla, Excilys...
    Allez la bas plutôt que chez Altruc!
    Détails en MP.