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 :

Une méthode écoute une autre ?


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut Une méthode écoute une autre ?
    Bonjour,

    J'ai un petit serveur et j'aimerais bien vérifier que les packets que j'envoie sont reçus... Donc à chaque "commande" serveur, le client renvoie un acknoledge.
    J'ai pour chaque commande 2 méthodes sur le serveur :
    1) envoieCommande
    2) recuAcknoledgeCommande

    Puis-je faire que ma méthode 1 regarde la 2 et agit dès que celle-ci reçoit le packet ? Pour l'instant la 2 se limite à écrire dans la console du serveur "clientX à reçu commandeY". Il se peut que j'envoie la même commande à 20 client et puisque les réponses ne seront pas dans l'ordre je ne peux pas simplement appeler la méthode 2 dans la 1.
    Que dois-je faire ?


    PS : Le serveur est en MVC-2.

    Cordialement,

    rXp>!<

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Ca va dépendre du temps qui peut s'écouler entre l'envoi de la commande et la notification de réception.

    Si le temps est court, c'est-à-dire de quelques minutes au maximum, j'aurais tendance à t'orienter vers un CountDownLatch ou un CyclicBarrier qui va te permettre de synchroniser les deux méthodes.

    Si le temps est de l'ordre de plusieurs heures voire davantage, le mieux est de passer par une base de données et un thread qui parcoure régulièrement cette base de données pour connaître l'état des processus.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par verbose Voir le message
    Ca va dépendre du temps qui peut s'écouler entre l'envoi de la commande et la notification de réception.

    Si le temps est court, c'est-à-dire de quelques minutes au maximum, j'aurais tendance à t'orienter vers un CountDownLatch ou un CyclicBarrier qui va te permettre de synchroniser les deux méthodes.

    Si le temps est de l'ordre de plusieurs heures voire davantage, le mieux est de passer par une base de données et un thread qui parcoure régulièrement cette base de données pour connaître l'état des processus.
    Ca va être un transfert d'information direct et à quelque secondes près au maximum.

    Mon serveur crée un Thread pour chaque "user connected" alors avec un countdownlatch (si j'ai bien compris la doc) je vais devoir créer un thread temporaire pour attendre la réponse de la commande ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Tu devrais faire un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void recuAcknoledgeCommande() {
    	final CountDownLatch latch = new CountDownLatch(1);
    	new Thread() {
    		@Override
    		public void run() {
    			latch.await();
    			receptionCommande() 
    		}
    	}.start();
     
    	//réception ack
     
    	latch.countDown();
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par verbose Voir le message
    Tu devrais faire un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public void recuAcknoledgeCommande() {
    	final CountDownLatch latch = new CountDownLatch(1);
    	new Thread() {
    		@Override
    		public void run() {
    			latch.await();
    			receptionCommande() 
    		}
    	}.start();
     
    	//réception ack
     
    	latch.countDown();
    }
    Donc receptionCommande va recevoir le acknoledge et dire "timeout" si après temps de secondes et d'essaie il n'a rien reçu ? Mais avec ce schéma là je ne comprend pas comment la première méthode sera prévenue.

    Je pensais faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public void envoieCommande() {
     
            //on prepare et envoie la commande
     
    	final CountDownLatch latch = new CountDownLatch(1);
    	new Thread() {
    		@Override
    		public void run() {
    			latch.await();
    			receptionCommande() 
    		}
    	}.start();
    	latch.countDown();
     
    }
    Qu'en penses-tu ?

    Cordialement,

    rXp>!<

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je ferais le traitement de la commande après le lancement du thread. Mais ça ne change rien au fond. C'est juste que tel quel, je ne vois pas l'intérêt d'utiliser un CountDownLatch vu que l'appel de countDown() se fait aussitôt après le lancement du thread.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par verbose Voir le message
    Je ferais le traitement de la commande après le lancement du thread. Mais ça ne change rien au fond. C'est juste que tel quel, je ne vois pas l'intérêt d'utiliser un CountDownLatch vu que l'appel de countDown() se fait aussitôt après le lancement du thread.
    Oui c'est certain que je pourrais juste faire un thread simple si je fais comme cela.

    Mais j'explique en peux plus :
    1) un commande arrive dans un thread client
    2) l'object serializé (data qui contient la commande et même des objects) est passé dans une classe qui contient toutes les commandes stockées et analyse celle-ci.
    3) En fonction de ce que c'est elle va appeler une méthode (donc si c'est un acknoledge de sendMessage ben elle va appeler acknoledgeSendMessage())
    4) la methode s’exécute.

    Donc ce que je voudrais c'est que la méthode sendMessage utilisé bien avant 1) puisse surveiller acknoledgeSendMessage pour être sûre que le message est arrivé à bon port.

    Et j'ai du mal à voire comment avec un CountDownLatch je peux faire cela vu que c'est sendMessage qui doit attendre sur acknoledgeSendMessage.
    Donc je devrais presque faire un nouveau thread pour sendMessage et un pour acknoledgeSendMessage et faire acknoledgeSendMessage.join() dans sendMessage non ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Je suppose que si tu veux que sendMessage() veille à la bonne réception de l'acquittement, c'est pour faire un traitement final. C'est ce traitement que tu dois isoler dans une méthode et que tu dois synchroniser avec le CountDownLatch.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par verbose Voir le message
    Je suppose que si tu veux que sendMessage() veille à la bonne réception de l'acquittement, c'est pour faire un traitement final. C'est ce traitement que tu dois isoler dans une méthode et que tu dois synchroniser avec le CountDownLatch.
    Ce que je veux faire c'est : attendre 3 sec si rien n'arrive je renvois le packet, attendre 3 sec... au bout de 3 fois je considère que le client a timeout et donc je close le socket.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Dans ce cas ce je verrais plutôt un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public boolean envoyerMessage() {
    	final boolean[] flag = new boolean[] {true};
    	final boolean[] status = new boolean[] {false};
    	new Thread() {
    		@Override
    		public void run() {
    			while (flag[0]) {
    				//envoie du message
    			}
    			status[0] = flag[0];
    		}
    	}.start();
    	Thread.sleep(3000);
    	flag[0] = false;
    	return status[0]
    }
    Il te suffit d'appeler la méthode envoyerMessage autant de fois que tu veux. Par contre, il faut que tu puisses sortir de la boucle d'envoi du message.

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

Discussions similaires

  1. Accès à une méthode d'une form depuis une autre autre form
    Par arngrimur dans le forum Windows Forms
    Réponses: 16
    Dernier message: 13/01/2012, 16h45
  2. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 14h59
  3. Réponses: 3
    Dernier message: 29/04/2008, 15h14
  4. Réponses: 2
    Dernier message: 31/08/2005, 17h12

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