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

avec Java Discussion :

Problème de readLine() qui bloque mon application


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut Problème de readLine() qui bloque mon application
    Bonjour à tous,

    Je suis actuellement en train de développer une petite application swing qui se connecte à une URL, récupère la réponse puis lit son contenu.
    J'utilise donc un Thread qui effectue certains traitements, et qui appelle un moment donné la méthode suivante:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    public void postURL (String a_Url, Alerte a)
    	{
    		logger.info("Récupération de la liste des liens. URL:" + a_Url.toString());
     
    		// Récuperation du saut de ligne
    		@SuppressWarnings("unused")
    		String o_sLineSep = null;
    		try
    		{
    			o_sLineSep = System.getProperty("line.separator");
    		}
    		catch (Exception e)
    		{
    			o_sLineSep = "\n";
    		}
     
    		BufferedReader reader = null;
     
    		try {
     
    			URL url = new URL(a_Url);
    			URLConnection connection = url.openConnection();
    			logger.debug("Connection à l'URL de la page");
    			reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    			logger.debug("Lecture de la réponse.");
     
    			boolean take = false;
    			page_suivante = "FIN";
     
    			logger.debug("Début d'extraction des liens de la page.");
     
    			String line;
    			while ((line = reader.readLine()) != null) {
     
    				// Dés que l'on rencontre cette balise dans la réponse, on indique que l'on extraira les lignes suivantes
    				if (line.contains("<div class=\"list-link\">")) {
    					take  = true;
    					logger.debug("Balise list-link trouvée.");
    				}
     
    				// Dés que l'on rencontre cette balise dans la réponse, on indique que l'on n'extraira plus les lignes suivantes
    				if (line.contains("<div class=\"list-img\">")) {	
    					take  = false;
    					logger.debug("Balise list-img trouvée.");
    				}
     
    				// Dés que l'on rencontre cette balise dans la réponse (url de la page suivante), initialise la variable 
    				if (line.trim().contains(">Page suivante</a>")) {
     
    					logger.debug("Balise page suivante trouvée.");
    					page_suivante = HTMLEntities.unhtmlentities(line.trim()).split("\"")[1];
     
    				}
     
    				// Suivant la variable take vue plus haut on créé ou non un objet Lien que l'on ajoute dans la liste des liens
    				if (take) {
     
    					if (line.trim().contains("<a href=")) {
     
    						Link leLien = new Link(HTMLEntities.unhtmlentities(line.trim()).split("\"")[1].split("/")[4].split(".htm")[0],HTMLEntities.unhtmlentities(line.trim()).split("\"")[3], HTMLEntities.unhtmlentities(line.trim()).split("\"")[1]);
    						listLiens.add(leLien);
    						logger.debug("Extraction du lien: " + HTMLEntities.unhtmlentities(line.trim()));
    					}
     
    				}
     
    			}
     
    			logger.debug("Fin d'extraction des liens de la page.");
     
    		} catch (IOException e) {
     
    			logger.error("Erreur dans la lecture de la réponse HTTP.");
    			a.setStatut("Erreur dans la lecture de la réponse HTTP.");
    			page_suivante = "FIN";
    			((MainWindows)parent).updateFillTable();
     
    		} catch (Exception e) {
     
    			logger.error("Erreur inconnue dans la lecture de la réponse HTTP: " + e.getMessage());
    			a.setStatut("Erreur inconnue dans la lecture de la réponse HTTP: " + e.getMessage());
    			page_suivante = "FIN";
    			((MainWindows)parent).updateFillTable();
     
    		}
    		finally {
     
    			if (reader != null) {
    				try {
    					reader.close();
    				} catch (IOException e) {
     
    					logger.error("Erreur dans la fermeture de la réponse HTTP.");
    					a.setStatut("Erreur dans la fermeture de la réponse HTTP.");
    					page_suivante = "FIN";
    					((MainWindows)parent).updateFillTable();
    				}
    			}
     
    		}
     
    	}
    Mon thread effectue les traitements puis attend 30 min, puis réexécute les traitements puis attend 30min etc.

    Mon code marche plutôt pas mal, sauf que parfois il se bloque au niveau de la boucle du readLine(). Aucune exception n'est levée, ce qui est gênant car le traitement est totalement bloqué.
    Je précise que le phénomène est aléatoire (parfois l'application fait 10, parfois 18 itérations sans problème).

    J'ai cru comprendre sur le net que readLine() pouvait être bloquant car les informations arrivent au compte goute. Ceci étant dit, je n'ai pas réussi à comprendre pourquoi ca bloqué. (pb de connexion lente?).

    Comment puis-je éviter ce problème? En utilisant autre chose que BufferedReader pour lire la réponse? (pour info je dois lire la réponse ligne par ligne).

    Merci beaucoup pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par critok Voir le message
    J'ai cru comprendre sur le net que readLine() pouvait être bloquant car les informations arrivent au compte goute. Ceci étant dit, je n'ai pas réussi à comprendre pourquoi ca bloqué. (pb de connexion lente?).

    Comment puis-je éviter ce problème? En utilisant autre chose que BufferedReader pour lire la réponse? (pour info je dois lire la réponse ligne par ligne).
    readLine() est bloquant, il bloque jusqu'à ce qu'il y ait quelque chose à lire. Et cela peut prendre du temps en fonction du serveur que tu interroges, et du réseau qu'il y a entre vous.
    Si à un moment les données cessent d'arriver pour toujours, readLine() va bloquer pour toujours.

    Sauf si tu mets un timeout sur URLConnection. Dans ce cas, readLine() lancera une SocketTimeoutException. Pour un timeout de 5 secondes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connection.setConnectTimeout(5000);
    connection.setReadTimeout(5000);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup pour ta réponse. C'est exactement ce qu'il me faut.
    Je vais essayer ca et je vous tient au courrant. Merci beaucoup!

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/12/2008, 10h30
  2. problème de Thread qui bloque ma Servlet
    Par need2learn dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 19/11/2008, 09h39
  3. Méthode qui bloque l'application
    Par Mister Nono dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2008, 11h44
  4. pare-feu bitdefender qui bloque mon réseau
    Par jackk dans le forum Sécurité
    Réponses: 8
    Dernier message: 08/04/2008, 15h24
  5. Erreur qui bloque mon programme
    Par bugland dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2006, 22h32

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