Java URLConnection Timeout

j'essaie d'analyser un fichier XML à partir d'une URL HTTP. Je veux configurer un délai de 15 secondes si le fetch XML prend plus de temps que ça, je veux signaler un délai. Pour une raison quelconque, le setConnectTimeout et le 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 la SocketTimeoutException.

Merci Chris

49
demandé sur Chris 2010-07-02 10:35:37

5 réponses

essayez ceci:

       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();

ou

       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

26
répondu Mat B. 2011-01-08 02:24:07

vous pouvez forcer manuellement la déconnexion par un Thread sleep. 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");
    }
}
10
répondu kinghomer 2013-10-04 13:01:27

j'ai utilisé le même code pour télécharger des logs à partir de serveurs. Je corrige mon code et découvre que l'implémentation de URLConnection qui est retournée est sun.net.www.protocole.http.HttpURLConnection.

Abstract class java.net.URLConnection a deux attributs connectTimeout et readTimeout et les setters sont dans la classe abstract. Croyez ou pas mise en œuvre sun.net.www.protocole.http.HttpURLConnection ont les mêmes attributs connectTimeout et readTimeout sans les paramètres et attributs de la classe implementation sont utilisés dans la méthode getInputStream. Ainsi, il n'y a aucune utilité de définir connectTimeout et readTimeout parce qu'ils ne sont jamais utilisés dans la méthode getInputStream. À mon avis, c'est bug in sun.net.www.protocole.http.Mise en œuvre de la connexion HttpURLConnection.

ma solution pour cela était d'utiliser HttpClient et obtenir la requête.

8
répondu dino.keco 2011-09-30 13:43:49

vous pouvez définir des temps morts pour toutes les connexions faites à partir de la jvm en changeant les propriétés suivantes du système:

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

chaque connexion s'éteindra après 10 Secondes.

paramétrage 'defaultReadTimeout' n'est pas nécessaire, mais montré comme un exemple si vous avez besoin de contrôler la lecture.

8
répondu Arjen Rodenhuis 2015-04-28 21:46:14

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

1
répondu xpmatteo 2017-05-23 11:54:48