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

Java Discussion :

Plantage au bout d'un moment


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Par défaut Plantage au bout d'un moment
    Bonjour,

    J'ai un problème dans le cadre d'une application qui sert de serveur de tchat.
    En gros il y a deux class principales RomuServer et AquaClientThread.

    RomuServer contient le main, un serverSocket, et un Vector de la liste des clients.
    Le serverSocket écoute et lorsqu'une connexion est acceptée, un nouveau AquaClientThread est créé et le stocke dans le :
    static Vector clientList= new Vector(); de la class RomuServer.

    Le problème est que le programme "plante", à certain un moment.
    C'est très aléatoire, il peut tenir 2 heures comme 2 jours avec 10 connectés ou 60.

    Donc j'ai essai de savoir d'où venait le problème en faisant des println partout à chaque début et fin de fonction et même plus.
    Et j'ai reussi à voir que le problème se créait dans cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        static synchronized void sendToAllClients(String message) {
     
            AquaClientThread foo;
            Iterator client_it = clientList.iterator();
            try {
                while(client_it.hasNext()) {
                    foo = (AquaClientThread)client_it.next();
                    if (foo!=null) {
    	  	    // dernier println possible lorsque le problème survient
                        foo.send(message,"MESSAGE");
                    }
                }
            } catch(Exception ex) { echo("plantage sendToAllClients "+ex); }
        }
    Donc cette fonction est dans la class principale RomuServer, et parcoure le Vector pour envoyer à tous les clients un message.
    Elle fonctionne la plus part du temps correctement, mais parfois la class RomuServer "freeze", le programme continue de tourner et les threads font encore leur boulot.
    Quand cela arrive, plus rien ne se passe sur RomuServer, et la dernièr action qu'il arrive à faire est un println juste avant le food.send().
    La fonction send ne se lance pas d'ailleurs dans le thread concerné, quand le problème survient.

    Je rappelle que la plupart du temps que la fonction sendToAllClients fonctionne correctement, mais qu'au bout d'un certain temps, très aléatoire, et à un certain moment dans la boucle, un foo.send fait freezer RomuServer, et je suis obligé d'arrêter le programme et de le relancer.

    Merci de m'aider, ou de donner des pistes s'il vous plait.

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Et à quoi correspond cette méthode send() ???

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Par défaut
    Comme son nom l'indique elle sert à envoyer un message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public void send(String message, String appelle){
                    // n'apparait pas lors que RomuServer freeze
    		out.println(message+'\u0000');
    		out.flush();
    	}
    Si je fait un screenOut.println juste au début de la fonction, il n'apparait pas, quand le problème survient bien sûr. Ça ne vient pas de send.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Donne le code de la méthode qui appelle "sendToAllClients".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Par défaut
    sendToAllClients est appelé dans pas mal d'endroit :
    - Une fois dans une fonction de AquaClientThread qui interprète les messages reçu. Si c'est un message texte qu'il faut envoyer à tout le monde : RomuServer.sendToAllClients(Pseudo+" : "+Msg);
    - Puis à plusieurs endroit dans RomuServer pour certaine requête spécial.

    Edit : J'ai fait beaucoup de teste, et je ne pense pas que ça dépende de la fonction qui appel sendToAllClients, mais là je vais tester une version qui me permet de savoir qu'elle est la fonction qui a appelé sendToAllClients au moment ou ça plante. J'ai plus qu'à attendre que ça plante.

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Bon heu... freezer ça veut dire quoi ?

    Je subodore qu'il s'agiréssasse d'un blocage du programme qui ne ferait plus rien : pas de stack trace, pas de fin de programme, plus même de println - la galère -, rien.

    Je pense que cela vient de threads qui attendent un déblocage de synchronized qui ne vient jamais. Il faudrait que tu nous établisses une sorte de schéma de tes synchronized ; quelles sont les variables partagées, quelles sont les portions de code verrouillées, etc.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2009, 16h49
  2. Firefox et OnBlur ne fonctionne plus au bout d'un moment
    Par Zoizoi dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/03/2009, 19h31
  3. plantage au bout de 2 boucles
    Par lecknaat dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/06/2007, 14h54
  4. Les objets disparaissent au bout d'un certain moment
    Par restricteur dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 17/05/2007, 18h03

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