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

API standards et tierces Java Discussion :

java.net taper une ressource avec délai


Sujet :

API standards et tierces Java

  1. #1
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut java.net taper une ressource avec délai
    Bonjour,

    Alors voilà, j'ai une URL.
    Je veux m'y connecter.

    Donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    URL url = new URL (_url);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.connect();
    Jusqu'ici tout va bien.
    Maintenant, si j'accéde via navigateur à cette URL, mon navigateur attend une réponse très très très longtemps avant de recevoir un code d'erreur : 502

    Dans mon programme, si je fais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    URL url = new URL (_url);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.connect();
    connection.getContent();
    Donc j'essaye de récupérer la réponse, là aussi mon programme attend très longtemps.
    En gros j'aimerai fixer un délai d'attente, si le délai est dépassé, je renvoie une exception.
    Alors j'ai tenté de setter le timeout à une petite valeur (60 ms), et ça n'a rien changé ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    URL url = new URL (_url);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setConnectTimeout(60);
    connection.connect();
    connection.getContent();
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  2. #2
    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
    vraisemblablement, vous n'avez pas de timeout à la connexion (le serveur répond tout de suite), mais il met un long moment à savoir ce qu'il va mettre dans la réponse.

    regardez du coté de commons http client de apache. Il dispose de plusieurs paramètres comme http.connection.timeout, http.socket.timeout, http.connection-manager.timeout

  3. #3
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut
    Merci, je vais regarder cette piste.
    Par contre, je n'arrive pas à télécharger le jar via maven ...

    J'ai bien ajouté la dépendance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <dependency>
    	    <groupId>org.apache.httpcomponents</groupId>
    	    <artifactId>httpcomponents-core</artifactId>
    	    <version>4.1</version>
    	</dependency>
    Mais j'ai le message suivant :
    Missing artifact org.apache.httpcomponents:httpcomponents-core:jar:4.1:compile
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  4. #4
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut
    Bon c'est bon, ça passe.
    Ca doit être le repo qui a eu une petite panne ...
    Ou ma connection qui chie va savoir.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  5. #5
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut
    Donc j'ai le code suivant qui me permet de récupérer le contenu d'une réponse 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
     
    public String extractFullContent(String _url)
    	{
    		String response_content = null ;
    		HttpClient httpclient = new DefaultHttpClient();
    		HttpGet httpget = new HttpGet(_url);
    		try
    		{
    			ResponseHandler<String> responseHandler = new BasicResponseHandler();
                            String responseBody = httpclient.execute(httpget, responseHandler);
                            if(responseBody != null) 
                            {
                             	response_content = responseBody ;
                            }
    		}
    		catch (ClientProtocolException e) 
    		{
    			System.out.println("[HTMLPage] url : " + _url + " doesn't support GET requests !!! ");
    			URL = "not a valid URL" ;
    			e.printStackTrace();
    		}
    		catch (IOException e) 
    		{
    			System.out.println("[HTMLPage] url : " + _url + " send no data !!! Not responding ... ");
    			URL = "not a valid URL" ;
    			e.printStackTrace();
    		}
    		finally
    		{
    			return response_content ;
    		}
    	}
    Maintenant, comment pourrai-je limiter le temps d'exécution de cette méthode ? je voudrais fixer un délai en gros.
    J'ai pas fini de lire la doc de httpClient ...
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  6. #6
    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
    regardez la doc de HttpClientParams qu'on peux passer en paramètre au constructeur de la classe httpclient

    Il y a de quoi jouer sur énormément de paramètres

  7. #7
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut
    Arf, vous parlez de la version 3 là.
    Dans la version 4, HttpClient est devenu une interface.
    La seule implémentation fournie est celle de DefaultHttpClient et c'est le bordel pour les paramètres.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  8. #8
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Autre piste : à partir de Java 5, l'API s'est étoffée de nombreuses classes et méthodes de programmation concurrente (Future, FutureTask, etc.).

    Celles-ci permettent de définir des timeouts sur les traitements.

    Via ces classes, tu peux donc "encapsuler" ton code avec une gestion de timeout indépendante de ton implémentation de connexion HTTP.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  9. #9
    Membre averti
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Points : 343
    Points
    343
    Par défaut
    Mouais. J'avais bricolé ça avec un timeout mais bon je trouve pas ça super propre si l'api proposer des solutions déjà faites pour gérer le temps de réponse.
    Là en fouillant la javadoc j'ai fini par trouver une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 3000);
    je peux modifier les paramètres de cette façon.
    Là du coup, passé 3 secondes à attendre une réponse, il renvoie une exception : SocketTimeoutException

    Ca m'a l'air pas mal ça.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  10. #10
    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
    Citation Envoyé par natoine Voir le message
    Arf, vous parlez de la version 3 là.
    Dans la version 4, HttpClient est devenu une interface.
    La seule implémentation fournie est celle de DefaultHttpClient et c'est le bordel pour les paramètres.
    Désolé, mais c'est toujours présent dans la 4, vous avez du mal lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public DefaultHttpClient(org.apache.http.params.HttpParams params)

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

Discussions similaires

  1. Probléme: un client java qui consomme une array avec soap
    Par mejdi331 dans le forum Services Web
    Réponses: 1
    Dernier message: 28/01/2009, 16h54
  2. Réponses: 2
    Dernier message: 10/10/2008, 00h37
  3. [Java/String] Completer une chaine avec un caractere
    Par shaun_the_sheep dans le forum Langage
    Réponses: 4
    Dernier message: 31/05/2005, 09h01
  4. [VB.NET] Compléter une chaine avec des espaces
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 09h09
  5. [VB.NET] Remplir une ComboBox avec une requete sql
    Par graphicsxp dans le forum Windows Forms
    Réponses: 6
    Dernier message: 22/03/2005, 15h29

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