web-dev-qa-db-fra.com

Java URLConnection Timeout

J'essaie d'analyser un fichier XML à partir d'une URL HTTP. Je souhaite configurer un délai d'expiration de 15 secondes si l'extraction XML prend plus de temps que cela, je souhaite signaler un délai d'expiration. Pour une raison quelconque, setConnectTimeout et setReadTimeout ne fonctionnent pas. Voici le code:

          URL url = new URL("http://www.myurl.com/sample.xml");
          URLConnection urlConn = url.openConnection();
          urlConn.setConnectTimeout(15000);
          urlConn.setReadTimeout(15000);
          urlConn.setAllowUserInteraction(false);         
          urlConn.setDoOutput(true);

          InputStream inStream = urlConn.getInputStream();
          InputSource input = new InputSource(inStream);

Et j'attrape l'exception SocketTimeoutException.

Merci chris

52
Chris

Essaye ça:

       import Java.net.HttpURLConnection;

       URL url = new URL("http://www.myurl.com/sample.xml");

       HttpURLConnection huc = (HttpURLConnection) url.openConnection();
       HttpURLConnection.setFollowRedirects(false);
       huc.setConnectTimeout(15 * 1000);
       huc.setRequestMethod("GET");
       huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
       huc.connect();
       InputStream input = huc.getInputStream();

OR

       import org.jsoup.nodes.Document;

       Document doc = null;
       try {
           doc = Jsoup.connect("http://www.myurl.com/sample.xml").get();
       } catch (Exception e) {
           //log error
       }

Et regardez comment utiliser Jsoup: http://jsoup.org/cookbook/input/load-document-from-url

27
Mat B.

Vous pouvez définir des délais d'attente pour toutes les connexions établies à partir de jvm en modifiant les propriétés système suivantes:

System.setProperty("Sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("Sun.net.client.defaultReadTimeout", "10000");

Chaque connexion expire après 10 secondes.

La définition de 'defaultReadTimeout' n'est pas nécessaire, mais elle est présentée à titre d'exemple si vous devez contrôler la lecture.

9
Arjen Rodenhuis

Vous pouvez forcer manuellement la déconnexion par une veille du thread. Ceci est un exemple:

URLConnection con = url.openConnection();
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
new Thread(new InterruptThread(con)).start();

puis

public class InterruptThread implements Runnable {

    HttpURLConnection con;
    public InterruptThread(HttpURLConnection con) {
        this.con = con;
    }

    public void run() {
        try {
            Thread.sleep(5000); // or Thread.sleep(con.getConnectTimeout())
        } catch (InterruptedException e) {

        }
        con.disconnect();
        System.out.println("Timer thread forcing to quit connection");
    }
}
9
kinghomer

J'ai utilisé un code similaire pour télécharger les journaux à partir de serveurs. Je débogue mon code et découvre que l'implémentation d'URLConnection renvoyée est Sun.net.www.protocol.http.HttpURLConnection.

La classe abstraite Java.net.URLConnection a deux attributs connectTimeout et readTimeout et les paramètres sont en classe abstraite. Croire ou non à l'implémentation Sun.net.www.protocol.http.HttpURLConnection ont les mêmes attributs connectTimeout et readTimeout sans paramètres et les attributs de la classe d'implémentation sont utilisés dans la méthode getInputStream. Par conséquent, il n'est pas utile de définir connectTimeout et readTimeout, car ils ne sont jamais utilisés dans la méthode getInputStream. A mon avis, c'est un bogue dans l'implémentation Sun.net.www.protocol.http.HttpURLConnection.

Ma solution pour cela consistait à utiliser les requêtes HttpClient et Get.

7
dino.keco

Êtes-vous sur Windows? L'implémentation de la prise sous-jacente sous Windows ne semble pas très bien prendre en charge l'option SO_TIMEOUT. Voir aussi cette réponse: setSoTimeout sur un socket client n’affecte pas le socket

0
xpmatteo