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 :

Requete HTTP qui prend plusieurs minutes


Sujet :

Java

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Par défaut Requete HTTP qui prend plusieurs minutes
    Bonjour,

    N'ayant eu aucune réponse dans mon autre sujet, j'essaye de reformuler ma demande pour que ce soit plus clair.

    J'essaye d'obtenir le code source de 3 pages différentes grace au code ci après.
    Malheureusement, la seconde url est un PDF de 50Mo et la requète prend donc énormément de temps à s'exécuter.
    Le but de ce topic : Essayer d'interrompre la lecture du pdf car c'est trop long et passer à l'url suivante. (donc la 3eme et dernière URL)

    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
    public class MonProjet
    {	
    	private static HttpClient httpclient = new DefaultHttpClient();
     
    	public static void main(String[] args)
    	{	
    		// Cette ligne s'execute sans souci.
    		String code1 = Http.doget(httpclient, "http://www.developpez.com/");
     
    		// Ici j'essaye d'accéder à un PDF super gros. J'aimerai donc trouver un moyen d'arreter la lecture de delui-ci pour passer au site suivant.
    		String code2 = Http.doget(httpclient, "http://booksnow2.scholarsportal.info/ebooks/oca1/29/lapolicedesmurse02fiauuoft/lapolicedesmurse02fiauuoft.pdf");
     
    		// Je n'arrive jamais à cette ligne car la lecture du PDF est trop longue, j'aimerai la stopper pour pouvoir avoir le code source de ce site.
    		String code3 = Http.doget(httpclient, "http://9gag.com/");
    	}
    }
    Voici ma fonction doget (qui se trouve dans une classe nommée Http) :

    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
    public static String doget(HttpClient httpclient, String url)
    {	
    	httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
    	httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
     
    	HttpGet httpget = new HttpGet(url);		
    	StringBuilder source = new StringBuilder();
    	String resa = null;
     
    	try
    	{ 
    		HttpResponse response = httpclient.execute(httpget);
    		BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            	String line;
     
    		// Cette boucle s'éxecute pendant plusieurs minutes dans le cas où on essaye de lire le pdf
    		// C'est trop long, je souhaiterai la stopper si ça prend trop de temps.
            	while ((line = reader.readLine()) != null) 
    		{
    			source.append(line+"\r\n");
    		}
     
    		resa = source.toString().trim();
     
    	} 
    	catch(IOException ioe) 
    	{
    		resa = "Erreur";
    		System.out.println("IO exception");
    		ioe.printStackTrace();
    	}
    	catch(Exception e)
    	{ 
    		resa = "Erreur";
    		System.out.println("Exception");
    		e.printStackTrace();
    	}
     
    	return resa;
    }
    Vous l'avez sûrement compris, mon but est de trouver un moyen de stopper la lecture du PDF sans détruire ni déteriorer mon httpclient. En effet, si on détruit ou déteriore ce httpclient, je ne pourrai pas avoir le code de ma dernière URL...

    Cela fait 3 jours que je bloque donc je vous en supplie si vous avez une idée, n'hésitez pas !

    Merci d'avance et bonne soirée !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Je ne connais pas de manière pratique de dire "ne cherche à lire cette URL que pendant 10 secondes, si ça prend plus de temps abandonne." En effet un timeout ne s'exprime que si cette connexion n'a pas répondu pendant le temps spécifié. Si la réponse arrive en petits bouts mais qu'elle est longue, le timeout n'intervient pas (c'est d'ailleurs une excellente attaque de DoS. Hem.)

    Ça peut se faire, en faisant abort() sur le HttpGet si on n'a pas fini avant 10 secondes. Le abort() va indiquer qu'on veut s'arrêter là, et le execute() va s'arrêter avec une erreur.
    Mais vu que ta méthode est coincée dans execute(), elle ne peut pas faire le abort() elle-même. Tu as besoin d'un autre thread qui va attendre 10 secondes et faire abort() si execute() n'est toujours pas fini au bout des 10 secondes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/11/2009, 17h42
  2. Réponses: 2
    Dernier message: 18/08/2009, 21h14
  3. Réponses: 12
    Dernier message: 14/01/2009, 14h44
  4. Requete selection qui mouline plusieurs minutes
    Par Bernard67 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 19/10/2008, 14h04
  5. [Tableaux] Variable qui prend plusieurs valeurs
    Par gandoulfe dans le forum Langage
    Réponses: 14
    Dernier message: 26/02/2006, 18h02

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