IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage Java Discussion :

Attendre un évènement avant de poursuivre l'exécution


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 22
    Points
    22
    Par défaut Attendre un évènement avant de poursuivre l'exécution
    Bonjour à tous,

    J'utilise dans mon programme Java un web service (pour lequel j'ai déjà posté plusieurs fois car il m'a bien pris la tête ...).
    Ce web service me renvoi une réponse de manière asynchrone, c'est pourquoi j'ai défini un listener comme il faut (j'utilise axis2).
    Dans mon programme, si je simplifie les choses, je réalise plusieurs appels à ce web service (une boucle).
    Puis j'ai besoin de recevoir toutes les réponses avant de poursuivre mon exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static void main(String[] args){
     
         while(maCondition) {
     
              // Appel au webservice
     
         } 
     
         // Code à exécuter quand toutes les réponses ont été reçues
     
    }
    Le problème c'est qu'à la sortie de ma boucle, même si tous les appels ont été effectués, je n'ai pas encore reçu de réponse et pourtant mon programme se termine. C'est tout à fait logique puisque mon programme ne peux pas deviner seul que des réponses vont lui être envoyées !

    J'ai imaginé plusieurs solutions, mais soit elles ne sont pas bonnes soit je ne sais pas comment les mettre en place :
    • Faire une attente active => abandonné car trop gourmand ?
    • Faire attendre le thread principal une durée suffisamment importante pour que toutes les réponses soient renvoyées => Inenvisageable !
    • Utiliser des threads comme listeners et attendre que chaque thread soit terminé pour continuer l'exécution => Possible ?


    J'ai l'impression qu'aucune des manières que j'envisage n'est la bonne, c'est pourquoi je vous sollicite !
    Comment dois-je procéder ?

    J'espère avoir été clair, mais n'hésitez pas à me demander des précisions si cela vous aiderait à résoudre mon problème !

    Merci,

    Cordialement
    Borozhim

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    En fait, je vois deux solutions :
    - L'utilisation du wait() après la boucle et du notify() lorsque tous les résultats sont arrivés.
    - déplacer le code qui se trouve après la boucle dans une méthode qui est appeler lorsque tous les résultats sont arrivés.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 22
    Points
    22
    Par défaut
    Pour ta deuxième solution, c'est en effet ce que j'avais fait au début. Le problème étant qu'après ma boucle, si je n'ai plus d'instruction, mon programem se termine avant le retour des réponses.

    Je vais essayer d'implémenter ta première solution avec wait() et notify() qui devrait fonctionner ^^

    En attendant j'ai utilisé un mix entre l'attente active et la pause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static void main(String[] args){
     
         while(maCondition) {
     
              // Appel au webservice
     
         } 
     
         while(!isComplete())
              Thread.sleep(2000);
         // Code à exécuter quand toutes les réponses ont été reçues
     
    }
    Sachant que dans mon cas le temps de réponse du serveur est de moins d'une seconde, cela suffit. Mais je vais quand même tenter l'utilisation de threads.

    Je reviens poster si ça fonctionne pour expliquer comment le mettre en place

    Merci du coup de main

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    En fait il faudrait surtout savoir comment tu fais appels à tes webservices (thread ?), et quel en sera l'utilisation finale (appli console, graphique, serveur, ...)


    a++

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 22
    Points
    22
    Par défaut
    Pour l'appel à mon webservice, je suis parti d'un fichier WSDL. J'ai généré des fichiers bien sales avec l'outil WSDL2Java d'Axis 2.
    Dans ces fichiers générés, j'ai un "Stub" et un squelette de listener.
    Je me suis contenté d'appeler une méthode publique du stub "startMonWebService" et d'implémenter un listener en héritant du squelette.

    Il y'a donc des threads en jeux, mais je ne les manie pas directement (Axis s'occupe de tout ...).

    Pour l'utilisation finale, appli console et appli graphique (Pourquoi faire simple quand on peut faire compliqué !)

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans ce cas c'est du coté d'Axis qu'il faut regarder pour savoir ce que tu dois utiliser pour l'attente.


    Concernant l'interface graphique ca marche différemment puisque tu la mettra à jour via le listener. A moins de vouloir bloqué certains éléments tu n'as pas besoin d'attendre quoi que ce soit explicitement...


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. attendre un moment avant d'exécuter une action
    Par keviin dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2009, 10h45
  2. Réponses: 1
    Dernier message: 23/09/2009, 17h31
  3. Réponses: 8
    Dernier message: 15/09/2009, 18h03
  4. Réponses: 3
    Dernier message: 12/07/2007, 02h40
  5. Attendre un évènement pour continuer l'exécution
    Par vinzzzz dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 22/11/2006, 21h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo