2009-12-17 14 views
7

Wir haben nächsten Code.
Manchmal sollten wir 10-20-40 Sekunden auf der letzten Zeile warten.
Was kann das Problem sein?Manchmal HttpURLConnection.getInputStream führt zu langsam

Java 1,4

URL url = ...; 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
conn.connect(); 
OutputStream out = conn.getOutputStream(); 
ObjectOutputStream outStream = new ObjectOutputStream(out); 
try 
{ 
    outStream.writeObject(objArray); 
} 
finally 
{ 
    outStream.close(); 
} 

InputStream input = conn.getInputStream(); 

AKTUALISIERT:
Next Code behebt das Problem in der Eklipse.
aber es hat über Java WebStart :(

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
System.setProperty("http.keepAlive", "false"); //<--------------- 
conn.connect(); 

Aber warum?

AKTUALISIERT noch einmal!
Bug wurde immer noch nicht behoben! :)

Wir mit Verbindungen arbeitete nicht in einer Klasse, aber in zwei.
Und es gibt folgende Zeile in der zweiten Klasse:

URL url = ... 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestProperty("Content-Length", "1000"); //<------------ 
conn.connect(); 

Hinweis: setRequestProperty("Content-Length", "1000") ist Ursache des Problems.

+0

Warum wird openConnection zweimal aufgerufen? –

+0

Es ist nur Druckfehler. Korrigiert. –

Antwort

8

'Wir hatten ein ähnliches Problem, das durch fehlerhaftes Keep-Alive in altem Java verursacht wird. Fügen Sie diese, bevor eine Verbindung, um zu sehen, ob es hilft,

conn.setRequestProperty("Connection", "close"); 

oder

System.setProperty("http.keepAlive", "false"); 
+0

Hat nicht geholfen :( –

+0

Wie wäre es mit dem zweiten Ansatz? Sie müssen wirklich einen TCP-Speicher bereitstellen, um genau zu sehen, was das Problem ist. Ich denke nicht, dass es DNS ist, weil das in connect() auftritt. –

+0

Es scheint mir, dass keepAlive = false hilft. Aber warum? –

2

Versuchen Sie es mit einer IP-Adresse. Um zu sehen, ob es ein DNS-Problem ist.

+0

Wir jave dieses Problem auf verschiedenen Computern und in verschiedenen Ländern :( –

+0

Haben Sie es mit Wireshark? –

1

Das Problem kann etwas von Netzwerkunterschicht sein ... Sollte schwer zu finden sein.

Aber was ist mit der setReadTimeOut() mit niedrigem Wert und eine while-Schleife?

+0

Wir verwenden Java 1.4 –

1

Eine Sache, die ich denke, ist, dass Ihr DNS-Server nicht gut reagiert.

Können Sie mit dem Ändern von symbolischen Domänennamen zu numerischen IP-Adressen experimentieren, bevor Sie beginnen? Oder können Sie jede Anfrage zweimal (nur zum Experimentieren) machen und sehen, ob die erste Anfrage wesentlich langsamer ist als die zweite?

Google hat unter anderem einen DNS-Server 8.8.8.8 eingerichtet. Sie behaupten, es ist schneller als die meisten anderen DNS-Server. Probieren Sie es aus!

+0

Wir jave dieses Problem auf verschiedenen Computern und in verschiedenen Ländern :( –

+0

In der gleichen Firma? Kann das DNS das gleiche in Ihrem privaten Netzwerk? – enguerran

+0

Nein - verschiedene Unternehmen, andere DNS, andere Netzwerke. –

4

hatte das gleiche Problem, fand heraus, dass es von IPv6 verursacht wurde.

Sie deaktivieren es von Code verwendet:

System.setProperty("java.net.preferIPv4Stack" , "true"); 

Sie können es auch über die Kommandozeile deaktivieren mit: g-Djava.net.preferIPv4Stack=true

1

ich gleiche Problem hatte, so dass ich zu Httpclient von Apache ändern, ein Beispiel folgen :

HttpClient httpClient = HttpClientBuilder.create().build(); 

HttpPost request = new HttpPost("www.myurl-to-read"); 

RequestConfig requestConfig = RequestConfig.custom() 
           .setSocketTimeout(8000) 
           .setConnectTimeout(10000) 
           .setConnectionRequestTimeout(1000) 
           .build(); 

request.setConfig(requestConfig); 

request.setHeader("Content-type", "application/json"); 

HttpResponse response = httpClient.execute(request); 

HttpEntity entity = response.getEntity(); 
String result = EntityUtils.toString(entity, "UTF-8"); 
Verwandte Themen