Wie kann ich einen Timeout gegen einen BufferedReader basierend auf einem URLConnection in Java?

StackOverflow https://stackoverflow.com/questions/93357

  •  01-07-2019
  •  | 
  •  

Frage

Ich mag den Inhalt einer URL lesen, aber nicht will, zu „hängen“, wenn die URL nicht reagiert. Ich habe einen BufferedReader mit der URL erstellt ...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

... und dann die Schleife begonnen, den Inhalt ...

lesen
do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

... aber wenn die Lese hängt dann die Anwendung hängt.

Gibt es eine Möglichkeit, ohne den Code bis auf die Socket-Ebene Schleifen, zu "time out" die Lese wenn nötig?

War es hilfreich?

Lösung

Ich denke, URLConnection.setReadTimeout ist das, was Sie suchen.

Andere Tipps

Wenn Sie Java 1.4:

Ich gehe davon aus dem Verbindungs-Timeout (URLConnection.setConnectTimeout(int timeout)) nützt nichts, weil Sie irgendeine Art von Streaming tun.

--- nicht töten den Faden --- Es kann unbekannte Probleme verursachen, offene Deskriptoren, etc.

Spawn ein java.util.TimerTask wo Sie überprüfen, ob Sie den Prozess abgeschlossen haben, andernfalls die BufferedReader schließen und den Output der URLConnection

Legen Sie eine boolean-Flag isFinished und legen Sie es am Ende der Schleife zu wahren und zu falsch vor der Schleife

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

Dies wird wahrscheinlich eine IOException verursachen, so dass Sie es zu fangen. Die Ausnahme ist keine schlechte Sache an sich. Ich Weglassen einige Erklärungen (das heißt Finale), so dass die anonyme Klasse können Sie Ihre Variablen zugreifen. Wenn nicht, dann eine POJO schaffen, die einen Verweis hält und passieren, dass auf die Timertask

Seit Java 1.5 ist es möglich, die Lese Timeout in Millisekunden auf dem darunter liegenden Sockel über das ‚setReadTimeout (int timeout)‘ Methode auf der URLConnection Klasse zu setzen.

Beachten Sie, dass es auch die ‚setConnectTimeout (int Timeout)‘, die die gleiche Sache für die erste Verbindung zum Remote-Server tun werden, so ist es wichtig, dass auch eingestellt werden.

Ich habe gerade vor kurzem in einer JVM 1.4-Umgebung zu diesem Thema gearbeitet. Die Standardantwort ist die Systemeigenschaften sun.net.client.defaultReadTimeout (lesen Timeout) und / oder sun.net.client.defaultConnectTimeout zu verwenden. Diese werden dokumentiert unter Networking Eigenschaften und können über das Argument -D auf der Java-Befehlszeile oder über einen System.setProperty Methodenaufruf eingestellt werden.

Angeblich soll diese werden durch die Umsetzung zwischengespeichert, so dass Sie sie nicht von einer Sache zur anderen so ein ändern können sie einmal verwendet werden, werden die Werte beibehalten.

Auch sie wirklich nicht für SSL-Verbindungen arbeiten ala HttpsURLConnection. Es gibt auch andere Möglichkeiten, mit, dass die Verwendung eines benutzerdefinierten SSLSocketFactory zu behandeln.

Auch hier all dies gilt für JVM 1.4.x. Bei 1.5 und höher haben Sie mehr Methoden zur Verfügung, um Sie in der API (wie durch die anderen Responder oben erwähnt).

Für Java 1.4, können Sie SimpleHttpConnectionManager.getConnectionWithTimeout (hostConf, connection_timeout) von Apache verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top