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 :

[Camel / ServiceMix / JMS / ActiveMQ] Gestion de files


Sujet :

Plateformes réactives et architectures modulaires Java

  1. #1
    Nouveau Candidat au Club
    [Camel / ServiceMix / JMS / ActiveMQ] Gestion de files
    Bonjour,

    Dans le cadre d'un projet universitaire, je suis chargée de la mise en place d'un composant d'orchestration des messages JMS entre 2 applications.

    L'idée est la suivante :
    - Mon composant est démarré, il est à l’écoute de la file 'File_Source'
    plusieurs messages arrivent simultanément sur cette dernière. Chaque message peut représenter 3 types d'événements (incident, position, événement) et il peut être critique ou non critique.
    - Mon composant doit filtrer les messages selon leurs types et les prioriser selon l’état.
    - J'ai une seule file source, et 3 files destinataires (File_evt, File_inc, File_pos).

    J'ai réussi à faire fonctionner une simple route (from to) mais sans passer par le Bean car pour ce dernier mon ServiceMix n'arrive plus à le reconnaitre.

    Merci pour votre aide.

  2. #2
    Expert éminent
    je ne sais pas comment tu code xml ou java
    en java il te faut passer par un routeur

    dans ta classe routeBuilder dans la méthode configure tu définit ta route ainsi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    from("monUrlFrom")
    .bean(MaClasseRouteur.class)
    .recipientList(header("RouteDestination"));


    tu définis la classe MaClasseRouteur.class
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MaClasseRouteur {
     
      public void route (Exchange exchange) {
        Message msg = exchange.getIn();
        //ton code pour décider vers où envoyer le message
        msg.setHeader("RouteDestination", "urlDeDestinationCalculee");
      }
     
    }


    si tu utilise spring ou blueprint la route est semblable mais il faut passer l'id du bean à utiliser dans l'attribut du tag

    et surtout définir le bean dans spring ou blueprint

    perso j'utilise un route builder java
    et donc dans le xml je mets simplement
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/blueprint"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
           http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
      <bean id="routeBuilder" class="foo.RouteBuilder" />
      <camelContext id="ng484-hegp-out" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
        <routeBuilder ref="routeBuilder" />
      </camelContext>
    </blueprint>


    A+JYT

  3. #3
    Nouveau Candidat au Club
    Bonjour,
    je vous remercie pour votre réponse,
    Moi je code en Java DSL, du coup , j'aimerais bien savoir, si dans la methode exchange, je peux préciser que par exemple
    if(obj instanceof Events)
    {
    Queue destination = 'File_evt'

    }
    else if (..... Position)
    {
    Queue destination="File-dest"
    }
    .....

  4. #4
    Expert éminent
    dans la classe
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MaClasseRouteur {
     
      public void route (Exchange exchange) {
        Message msg = exchange.getIn();
        //ton code pour décider vers où envoyer le message
        msg.setHeader("RouteDestination", "urlDeDestinationCalculee");
      }
     
    }

    tu peux mettre ce que tu veux
    getIn() te retourne un objet message qui est le message reçu en entré.

    le corps du message et l'objet reçu tu peux donc vérifier ce que tu veux dessus
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MaClasseRouteur {
     
      public void route (Exchange exchange) {
        Message msg = exchange.getIn();
        Object obj = msg.getBody();
        if(obj instanceof Events) {
          msg.setHeader("RouteDestination", "jms:File_evt");
        } else if (..... Position) {
          msg.setHeader("RouteDestination", "jms:File-dest");
        }
      }
     
    }


    le recipientlist de
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    from("monUrlFrom")
    .bean(MaClasseRouteur.class)
    .recipientList(header("RouteDestination"));


    va envoyer ton message dans la file jms File_evt ou dans la file jms File-dest
    A+JYT

  5. #5
    Nouveau Candidat au Club
    Bonjour,
    Ca marche impeccable le filtrage pour moi, je vous remercie infiniment pour votre aide, du coup, j'aimerais bien savoir, pour servicemix, comment faire pour qu'il reconnaisse mon bean, ou est ce que je dois mettre mes classe java ???
    dans le dossier bin??
    Merci pour votre aide

  6. #6
    Expert éminent
    non c'est dans le fichier bleuprint.xml ou Spring.xml

    il faut faire
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- instancier le bean et lui associer un id -->
    <bean id="myBean" class="org.apache.camel.spring.bind.ExampleBean"/>
     
    <camelContext xmlns="http://camel.apache.org/schema/spring">
      <route>
        <from uri="direct:start"/>
        <!-- utiliser le bean dans la route --> 
        <to uri="myBean"/>
        <!--ou encore -->
        <to uri="bean:myBean" />
        <to uri="mock:results"/>
      </route>
    </camelContext>


    A+JYT

  7. #7
    Nouveau Candidat au Club
    oui, mais à votre avis, la fichier physique (Monbean.java), je le laisse dans mon workspace ???? ne faut pas-il le mettre quelque part sous servicemix???

  8. #8
    Expert éminent
    il faut packager le projet contenant la route et le bean dans un un bundle (jar)
    le plus simple est d'utiliser maven et l'archetype camel-archetype-blueprint

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mvn archetype:generate \
      -DarchetypeGroupId=org.apache.camel.archetypes \
      -DarchetypeArtifactId=camel-archetype-blueprint \
      -DarchetypeVersion=2.9.0 \
      -DarchetypeRepository=https://repository.apache.org/content/groups/snapshots-group


    cela va te créer un projet qui contient tout ce qu'il faut
    le xml de la route est à placer dans le fichier blueprint.xml
    et le java dans src/main/java

    ensuite quand tu as tous développé tu te place dans le dossier du projet et tu fait
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    mvn install
    ça crée le jar qui va bien tu n'a plus qu'à le déposer dans deploy
    A+JYT

  9. #9
    Nouveau Candidat au Club
    Du coup, je crois qu'il faut ajouter quelque chose spécifique dans le pom.xml, n'est ce pas ?????

  10. #10
    Expert éminent
    l'archetype ajoute tout ce qu'il faut dans le pon

  11. #11
    Nouveau Candidat au Club
    Merci infiniment pour votre réponse, je vais essayer tout de suite et je te tien au courant

  12. #12
    Nouveau Candidat au Club
    Bonjour,
    je reviens vers vous, car je n'arrive toujours pas à deployer mon blueprint projet sous servicemix,
    j'ai suivi votre réponse, j'ai généré le projet avec l'archetype blueprint, j'ai ajouté les dépendances dont j'ai besoin au Pom.xml, j'ai fait un update du projet, un mvn compile, mvn install.... , j'ai pris le jar généré, je l'ai mis dans le deploy, et voici l'erreur :

    Merciii

  13. #13
    Expert éminent
    je pensais que vous utilisiez servicemix

    karaf ne contient pas les élément de base pour camel
    il y a de nombreuse dépendance à charger

    le plus simple est d'utiliser servicemix (au moins pour tester)
    car dans ce dernier tous les bundles camel sont référencé
    il suffit de faire features:list pour voir la liste des éléments dispo
    et features:install pour installer celle qui manque.

    pour utiliser karaf avec camel il faut démarrrer karaf puis ajouter nombres de features et enfin faire features:install de toutes celle dont à besoint votre route.

    pour éviter ça j'ai poster une "distribution minimale pour karaf - camel" dans le forum
    ce n'est qu'un début de distribution mais elle montre comment s'y prendre pour assembler tous les éléments nécessaires à camel dans karaf

    ce genre de message d'erreur signifi que dans ta karaf le bundle qui exporte le package org.apache.camel n'est pas installé
    de mémoire ce doit être camel-core mais il faut aussi camel-osgi et si tu as choisi bleuprint camel-blueprint

    pour le reste ça dépend de ta route si elle contient une connexion ftp il te faut camel-ftp etc.

    A+JYT