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

Entrée/Sortie Java Discussion :

NIO/SelectionKey: votre avis? normal? pas normal?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Par défaut NIO/SelectionKey: votre avis? normal? pas normal?
    Bonjour,

    Je suis en train de créer un "mini" serveur NIO. Je voudrais effectuer les traitements de lecture dans un autre Thread.
    Et j'ai une humble question !

    Le serveur lit en boucle les données dans le selector
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    While(true)
    ..blabla //on parcours les clés dans le selector
     
    if(k.isAcceptable()){
      blabla...
    if(k.isReadable()){
       // si y'a une clé "lisible" alors il ajoute la clé dans une LinkedList (que je nomme queue)
      queue.add(k);
    }
    Et j'ai un thread qui lit en boucle ma queue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(true)
       if(queue.size()>=1){
            SelectionKey k = queue.remove();
            readData(k);
       }
    }
    La fonction readData(k); lit le contenu de la clé et fait le traitement correspondant.

    Problème:

    Le problème, c'est qu'entre le moment où j'ajoute la clé(SelectionKey) dans la queue (linkedList) et que la clé soit effectivement lue et traitée par le thread qui lit la queue.... la clé a été inséré plein de fois dans la queue...
    Donc, je me suis dis, "une fois que je lis la clé, je peux faire un k.cancel()..." mais c pas une bonne solution non plus...
    La conclusion est que, ce que je veux faire ne peux pas se faire en stockant les clés dans une queue.

    Ma conclusion:

    En faites, quand je lis les clés, il faut que je lise le contenu et c'est ce le contenu que je met dans la queue (LinketList) et ensuite mon thread "traitement" réalise le traitement correspondant.

    Est-ce que ca vous parait correcte ce que je dis?




    Merci de m'avoir lu,
    Bien cordialement.

    Cécilia.

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,


    Une solution possible est:

    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
    18
    19
     
    while (selector.select() > 0) {
        // Récupère les clés sélectionnées dans une collection
        Set keys = selector.selectedKeys();
        // Parcourir les clés selectionnées
        Iterator i = keys.iterator();
        while (i.hasNext()) {
            // On isole la clé courante
            SelectionKey k = (SelectionKey) i.next();
            // Retire la clé courante de la collection
            i.remove();
            if (k.isAcceptable()) {
               blabla...
             }  
             if (k.isReadable()) {
                // si y'a une clé "lisible" alors il ajoute la clé dans une LinkedList (que je nomme queue)
               queue.add(k);
              }
            .....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Par défaut
    Merci, pour info, j'avais déjà mis le remove().

    En faites ce que je voulais faire ne pouvait pas marcher.
    Désormais, je lis le contenu de la clé, et je récupère la clé "key"
    Je créais un objet new Requete(data, key) et j'ajoute dans la queue ma requete.
    Et ca marche sans soucis...

    Pour des soucis de performance je voulais éviter de faire lire le contenu de la clé (quand isReadable() == true) sur le serveur, mais finalement, le serveur lit le contenu, il ne fait que ça.
    D'autres threads s'occupent que du traitement (base de données, réponse aux autres clients etc.., renvoie des données, consulation de tables, etc..)

    Bref, de toute façon j'avais pas le choix

    Merci en tous ça

  4. #4
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Ne serait-il pas plus simple, avant d'effectuer une insertion dans queue, de vérifier si cette clé n'est pas déjà dans queue ? Cela éviterait les doublons.

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

Discussions similaires

  1. LEFT JOIN qui marche ? pas normal !
    Par gok6tm dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/11/2007, 20h53
  2. Réponses: 9
    Dernier message: 17/06/2007, 19h45
  3. NoClassDefFoundError pas normal
    Par arasium dans le forum Langage
    Réponses: 10
    Dernier message: 20/06/2006, 14h38
  4. [Win XP 64] A votre avis : a installer ou pas ?
    Par Gromitou dans le forum Windows XP
    Réponses: 1
    Dernier message: 10/04/2006, 14h50
  5. Réponses: 3
    Dernier message: 23/02/2006, 08h30

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