Forum Programmation.java Axis + Un grand nombre de messages

Posté par  .
Étiquettes : aucune
0
13
oct.
2006
Bonjour à tous !

J'utilise Axis 1.3 et je dispose d'un client que je ne peux modifier qui envoie un grand nombre de messages au serveur. Je voudrais savoir si il est possible de faire en sorte que les messages SOAP arrivant soient empilés dans une sorte de queue pour être traité au rythme du serveur dans pénaliser le client.
  • # Salut!

    Posté par  . Évalué à 1.

    Tes messages SOAP sont asynchrones?

    Je comprend pas vraiment ce que tu veux faire....
    tu peux expliquer un peu plus?

    Cela dit, synchrone ou pas, il est peut être possible de bidouiller un truc avec des variables de classe dans le service, et de gérer une sorte de queue avec le AxisEngine non? tu as envisagé un truc du genre?
    • [^] # Re: Salut!

      Posté par  . Évalué à 1.

      Oui, les messages sont asynchrones.
      Mais axis 1.3 ne semble pas gérer l'asynchronisme.
      Ce que je voudrais c'est que axis stocke les messages au fur et à mesure qu'ils arrivent dans une queue en attendant de les traiter à son rythme. Le client envoie un trés grand nombre de messages par seconde et le traitement métier du coté serveur est relativement long. Et je ne veux pas perdre un seul message.
      • [^] # Re: Salut!

        Posté par  . Évalué à 1.

        oui, j'ai pas réussi à faire de l'asynchronisme avec axis1.4 moi non plus, en fait on peut utiliser JMS comme protocole de transport pour ça, j'ai jamais réussi à l'utiliser...

        En fait, si j'ai bien compris, tes messages sont synchrones mais en one-way, c'est ça???

        Une solution serait que ton service contact une file de message en local sur la bécane qui héberge le-dit service.
        A chaque message soap reçu, le service empile les infos du message sur la file de message, et à côté (toujours sur la même machine) tu as un démon java qui pioche dans la file de message et exécute ton code métiern (avec une lecture bloquante sur la file de message pour qu'il se mette en attente s'il n'y a plus de message dans la file).
        Mais c'est peut être un peu tordu... non?

        Cela dit, l'important si j'ai bien compris, ce n'est pas tant l'asynchronisme, mais le fait que le service traite les messages un par un, non?

        Et euh, tu peux faire héberger Axis par Geronimo, le conteneur d'EJB d'apache, qui apporte aussi un conteneur de file de message (ActiveMQ), je l'ai fait il y a quelque mois, c'est assez simple à mettre en oeuvre je crois.

        Si cela peut être utile...
        • [^] # Re: Salut!

          Posté par  . Évalué à 1.

          mmhh, oui mais je ne peux toucher au client. Ce qui veut dire que je dois créer un web service from scratch qui se contente d'empiler les messages soap reçus du client dans une queue auquel a accés le "vrai" web service.


          PS : le tout fonctionne sous JBoss 4.0.4 GA.
          • [^] # Re: Salut!

            Posté par  . Évalué à 1.

            mouais, du coup, c'est un peu tordu, trop peut être.

            Une autre bidouille, qui ferait plus propre, et plus rapide à implémenter, serait de faire genre une ArrayList static dans la classe du service, et un flag boolean, static aussi ,pour signifier qu'un service est exécute ton code métier.
            Le premier service contacté prend le contrôle de l'ArrayList, tous les autres remplissent cette ArrayList puis se termine.
            Et du coup, une seule instance du service exécute ton code métier à un instant donné, même si plusieurs instance du service peuvent ajouter des messages dans la liste (et avec un synchronized pour les placer dans l'ordre).

            Un truc du genre:

            static boolean flag;
            static ArrayList msg;

            //quelques methodes static pour accéder au champs static, //synchronized pour faire vérrou sur les champs

            static final int GET_FLAG = 0;
            static final int FREE_FLAG = 1;

            //pour gérer le flag
            public static synchronized void manageFlag(int n){
            if(n == GET_FLAG){
            flag = true;
            }else if(n == FREE_FLAG){
            flag = false;
            }
            return flag;
            }

            //pour récup le premier message dans la liste
            public static synchronized SOAPMessage getNextMsg(){
            //si liste vide retourne null
            }

            //pour ajouter à la fin de la liste le nouveau message
            public static synchronized SOAPMessage addMsg(SOAPMessage){...}

            //et ton service
            public void service(SOAPMessage request, SOAPMessage response){
            addMsg(request);
            if (!manageFlag(GET_FLAG)){
            SOAPMessage msg = null;
            while(msg=getNextMsg()!=null || manageFlag(FREE_FLAG)){
            if(msg == null){
            msg = getNextMsg(); //pour les pblms de synchro
            }
            //appel du code métier, contenu dans une méthode de la classe du service par exemple
            }
            }
            }

            c'est jouable je crois....

            Sinon, je suis curieux, c'est dans quel contexte appalicatif que tu fais ça?

            cordialement,
            • [^] # Re: Salut!

              Posté par  . Évalué à 1.

              mince, la signature de manageFlag devrait être:

              public static synchronized boolean manageFlag(int n);
              • [^] # Re: Salut!

                Posté par  . Évalué à 1.

                Je ne suis pas sûr... Le client crée une seule connexion et envoie tous ses messages les uns à la suite des autres. ça veut donc dire que je n'ai qu'un seul service d'instancié (enfin je crois).


                Le contexte, en gros, j'ai des machines qui envoient des messages sur leur état. Chacun de ces messages doit être traité (stocké, envoyé par mail, ...). Le web service sert de dispatcher et de filtre. Le truc c'est que je peux avoir à un moment donné environs 10000 (dix mille) messages par secondes. Et le client ne dois pas souffrir du manque de performance du web service. C'est pour ça que je dois le rendre rapide. J'imagine soit en le simplifiant un max (genre je ne lui fait prendre que une string que je stocke quelque part et il rend la main) et en délégant le traitement métier à un tiers non bloquant pour le web service soit en le transformant comme tu me l'as montré mais j'ai peur que dans mon cas cela ne fonctionne pas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.