2011-01-14 7 views
1

Die unter Thread in einer Schleife ist, und es verbindet nur auf einen Server, eine Datei herunterlädt, schließt die Verbindung und dann wiederholt den Vorgang. Die folgende Ausnahme wird nach ca. 500 Iterationen der Schleife geworfen -nicht sicher, warum ‚java.net.ConnectException: Connection timed out: connect‘ Ausnahme auftritt

java.net.ConnectException: Anschluss timed out: connect

Warum könnte dies auftreten werden? Gibt es eine Möglichkeit, den Thread zu beenden, sobald die Ausnahme ausgelöst wird?

-Code -

public void run() { 

    boolean isExceptionThrown = false; 

    try { 
    while(true){ 

     URL url = new URL(urlString); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

     String inputLine; 

     while ((inputLine = in.readLine()) != null) 
     { 
      //do nothing, just want to read the file 
     } 

     in.close(); 

     ++counter; 
     System.out.println("Thread id : "+this.threadId+" Connection number : "+counter +" URL : "+urlString); 
     } 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

Dank.

+0

Ich sehe die tomcat und tomcat6 Tags, wie diese Frage zu Tomcat verwandt ist? – gabuzo

+0

Haben Sie den Befehl "netstat" auf dem Server oder dem Client versucht, um zu überprüfen, ob noch nicht geschlossene Verbindungen von Ihrer App bestehen? – biziclop

+0

Ich habe es Tomcat hinzugefügt, falls Server serverseitig sein könnte .... –

Antwort

1

Vorbehalt: spekulieren hier. Obwohl Ihr Client-Code die Verbindung schließt, wird Ihr Server möglicherweise nicht so schnell bereinigt, daher kann Ihr Client keine neue Verbindung herstellen. Es klingt sicherlich wie bei den ~ 500 Verbindungszeichen der Server ist etwas überfordert.

Versuchen in so etwas wie ein Schlaf für 10s setzen, wenn Count == 400, um zu sehen, ob das einen Unterschied macht, wie viele Sie verarbeiten können?

+0

Danke für die Hilfe alle! –

+0

Hat das dann funktioniert? – Brian

0

Zunächst einmal denke ich, der Faden nach dem Drucken des Stack-Trace beenden wird, so dass Sie sollten das den Faden töten.

die Gründe betrifft, so gibt es nicht genügend Informationen in Ihrer Frage, um herauszufinden, was das eigentliche Problem ist. Ich denke, Sie sollten auch auf der Serverseite nachsehen, ob das Herunterladen für immer dieselbe Datei kein Problem auf der Serverseite verursacht oder eine Schutzmaßnahme auslöst.

Es wollen Sie sicher sein, Sie so etwas wie Wireshark können die Netzwerkaktivität zwischen dem Client und dem Server zu überprüfen. Sie werden wahrscheinlich feststellen, dass Sie auf der letzten Verbindung ausgehende Pakete, aber keine eingehenden Pakete sehen.

1

Es könnte sein, dass der Server durch zu viele Verbindungen überschwemmt wird immer. Selbst wenn Sie den Stream schließen, ist es möglich, dass der Server einige Zeit benötigt, um den Socket herunterzufahren.

Der Code, den Sie haben, wird die Schleife verlassen, sobald eine Ausnahme ausgelöst wird, da sich der catch Block außerhalb des while (true) Blocks befindet. Sobald run zurückkehrt, wird der Thread sterben.

2

Das Problem ist, dass Sie nie Ihre Verbindungen zu voll lassen Sie Ihre Reader einmal schließen und lassen Sie die Gewinde freien Ressourcen für die nächste while Schleife:

Es könnte zu viel Verbindung in einem Thread-Pool sein, dass eine andere zu schaffen 1 (während andere versuchen zu schließen) erstellt eine Zeitüberschreitung (das ist meine Vermutung).

Tun Sie dies statt (pseudo Java-Code):

while (true) { 
    BufferedReader in = null; 

    try { 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (Exception ignore) { 
       ignore.printStackTrace(); 
      } 
     } 

     in = null; 
    } 
} 

Auch geben Sie Ihre Thread Zeit, um "sauber" selbst, bevor es aus der Tätigkeit völlig frei ist. Versuchen Sie sleep/warten auf den Thread, um eine Verbindung vollständig zu schließen und seine Ressourcen freizugeben.

+0

Wenn das Zeitlimit beim Öffnen der Verbindung aufgetreten ist, wird die Verbindung nicht hergestellt und somit kein Reader erstellt - Sie müssen also nichts mehr schließen;) – tigger

+1

@Elite: Der geschriebene Code wird einmal von 'run' zurückgegeben Die erste Ausnahme wird ausgelöst. Wenn eine Ausnahme * nicht * geworfen wird, wird 'in.close' aufgerufen. Wenn also 'close' nicht aufgerufen wird, ist ** nicht ** das, was die Ausnahme verursacht. Die Aufräumzeit wird wahrscheinlich helfen. –

+0

Gleiche Bemerkung wie bei Cameron, die Ausnahme wird außerhalb der 'while' abgefangen, so dass es höchstens eine nicht geschlossene Verbindung gibt. Abgesehen davon, dass dies ein Problem mit der offenen Verbindung war, wird die Fehlermeldung keine Zeitüberschreitung sein, sondern etwas wie * zu viele offene Dateien * – gabuzo