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 :

Problème de Thread immortel!


Sujet :

Java

  1. #1
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut Problème de Thread immortel!
    Salut tout le monde,

    Je viens vers vous car j'ai un soucis dans du code que j'ai repris avec un thread qui ne se termine pas.

    Voilà mon programme fonctionne comme ceci :
    Je lui file un liste d'adresses IP (environ 2000)
    Il va interroger ces adresses pour y récupérer une page web grâce à 200 threads simultanés (qu'il stocke dans une collection)
    Ensuite il parse la page reçue pour affecter des variables.

    Tout fonctionne sur 1999 IP, car même lorsqu'elles ne répondent pas il y a un timer qui permet une fois qu'il est atteint de ne plus attendre le résultat du thread et le supprime de ma collection.

    Le problème c'est qu'avec une adresse IP le comportement est bizarre, le ping fonctionne mais l'accès à cette page web n'arrive jamais, même via un navigateur je n'arrive pas à avoir de réponse, même pas le timeout d'IE par exemple.

    Donc je cherche un moyen de mettre un timer dans la récupération de cette page pour que au bout de 1 minute par exemple le thread se kill tout seul. Voici le bout de code qui me permet de se connecter à l'IP puis de récupérer la page :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public void checkFirmware(String Error)
    {
      try {
    	com.meterware.httpunit.WebConversation wc = new WebConversation();
    	wc.setAuthorization(data.login, data.password);
    	wc.set_connectTimeout(0);
    	wc.set_readTimeout(0);
     
    	String host = data.ip;
    	int timeOut = 120000; // I recommend 3 seconds at least
    	boolean status = InetAddress.getByName(host).isReachable(timeOut);
     
    	if (status) 
            {
    	    WebRequest req = new GetMethodWebRequest("http://" + data.ip + "/info_data.htm");
                //Lors du bug la ligne suivante ne répnd jamais
    	    WebResponse resp = wc.getResponse(req);	
    	    int IndexFirm = resp.getText().indexOf("info_other_value");
    	    String SsChaine = resp.getText().substring(IndexFirm,IndexFirm + 50).replace ("'","");
    			.......
    		}
         }
         catch (Exception e)
         {
    	System.err.println("Impossible de récuperer les valeurs de l'IP : " + data.ip + System.getProperty("line.separator" ));
    	parent.removeThread(this);
          }
    }
    Merci de votre aide!

  2. #2
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il envoie peut-être un octet par seconde par exemple. C'est un serveur que tu connais ? Tu le contrôle ? Ou il est sur internet ?
    Le getResponse attend d'avoir toute la réponse avant de se terminer, c'est du synchrone.
    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.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Non il n'envoie pas un octet par seconde j'ai essayé de surveiller les flux avec WireShark mais une fois la requête partie, il n'y a pas de retour.

    La requête est envoyée vers un "serveur web embarqué" (dans un équipement réseau) sur lequel je n'ai pas la main mais que je connais.

  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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Peux-tu nous donner ce qui est exactement envoyé par le client ? Tout ce que voit passer WireShark ?
    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 habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Juste pour info, je sais que ce périphérique répond anormalement il est en attente de réparation ce que je voudrais c'est que mon programme sache traiter ce genre d'anomalie sans se bloquer.

    Voici la trace wireshark.
    Fichiers attachés Fichiers attachés

  6. #6
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ceci dépasse mes compétences réseau. La machine distante répond un ACK, il semble donc que c'est le client qui n'interprète pas correctement la réponse et ne sait pas quoi lui dire.
    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.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu mettait autre chose que 0 dans le connect timeout et le read timetout, ca marcherait peut etre mieux? nan?

  8. #8
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    si tu mettait autre chose que 0 dans le connect timeout et le read timetout, ca marcherait peut etre mieux? nan?
    +1.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  9. #9
    Membre habitué
    Inscrit en
    Juin 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 213
    Points : 154
    Points
    154
    Par défaut
    Oui je pense aussi que c'est le client qui n'interprète pas correctement la réponse, mais comment faire pour mettre un timeout sur le "getResponse" afin de quitter ce thread en cas d'attente trop longue?

    Merci tchize_, mais j'avais déjà essayer de mettre 20 ou 1 par exemple et ça ne marche pas mieux!!

  10. #10
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    L'API n'implémente peut-être pas de timeout ?
    Es-tu sûr qu'un navigateur classique bloque indéfiniment ? Tu as attendu combien de temps ?
    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.

  11. #11
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Il va interroger ces adresses pour y récupérer une page web grâce à 200 threads simultanés (qu'il stocke dans une collection)
    Pourquoi ne pas utiliser un ExecutorService ? Tu pourras mettre un timeout à chaque tâche.
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

Discussions similaires

  1. Problème de thread : Plus de ressources système
    Par OliverSleep dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2006, 15h35
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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