Was könnte die Ursache Buchse ConnectException: Connection timed out?
Haben wir eine Webstart-client, kommuniziert mit dem server durch das senden serialisierte Objekte, über HTTPS mithilfe von java.net.HttpsURLConnection
.
Alles funktioniert einwandfrei auf meinem lokalen Rechner und auf dem test-Server befindet sich in unserem Büro, aber ich ' m erleben eine sehr, sehr seltsame Frage, die nur auftreten, auf unsere Produktions-und staging-Servern (und sporadisch an, dass). Der wesentliche Unterschied den ich kenne zwischen diesen Servern und die, die in unserem Büro ist, dass Sie sich an anderer Stelle und client-server-Kommunikation mit Ihnen ist zwar deutlich langsamer, aber es funktionierte gut für eine lange Zeit in der Produktion vor, dies auch.
Anyway, hier ist was passiert ist:
- Der client nach der Einstellung von Optionen wie lese-timeout und-Eigenschaften wie
Content-Type
auf dieHttpURLConnection
fordertgetOutputStream()
auf es, um den stream zu schreiben. - An dieser Stelle, was ich sagen kann, der client reagiert nicht mehr für einige Zeit.
- Der client wirft dann die folgende Ausnahme:
java.net.ConnectException: Connection timed out: connect bei java.net.PlainSocketImpl.socketConnect(Native-Methode) bei java.net.PlainSocketImpl.doConnect(Unknown Source) bei java.net.PlainSocketImpl.connectToAddress(Quelle Unbekannt) bei java.net.PlainSocketImpl.connect(Unknown Source) bei java.net.SocksSocketImpl.connect(Unknown Source) bei java.net.Socket.connect(Unknown Source) bei com.Sonne.net.ssl.intern.ssl.SSLSocketImpl.connect(Unknown Source) bei com.Sonne.net.ssl.intern.ssl.BaseSSLSocketImpl.connect(Unknown Source) bei der sun.net.NetworkClient.doConnect(Unknown Source) bei der sun.net.www.http.HttpClient.openServer(Unknown Source) bei der sun.net.www.http.HttpClient.openServer(Unknown Source) bei der sun.net.www.Protokoll.https.HttpsClient.(Quelle Unbekannt) bei der sun.net.www.Protokoll.https.HttpsClient.Neue(Unbekannte Quelle) bei der sun.net.www.Protokoll.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Quelle Unbekannt) bei der sun.net.www.Protokoll.http.HttpURLConnection.plainConnect(Quelle Unbekannt) bei der sun.net.www.Protokoll.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) bei der sun.net.www.Protokoll.http.HttpURLConnection.getOutputStream(Quelle Unbekannt) bei der sun.net.www.Protokoll.https.HttpsURLConnectionImpl.getOutputStream(Quelle Unbekannt)
Beachten Sie, dass dies nicht ein SocketTimeoutException
, die die connect()
Methode auf HttpURLConnection
sagt es, wirft, wenn das timeout abläuft, bevor eine Verbindung hergestellt werden kann. Auch, wenn dies geschieht, ich bin in der Lage zu nennen conn.getResponseCode()
und ich bekomme einen response-code von 200.
- Auf der server-Seite, ein
EOFException
geworfen wirdObjectInputStream
's Konstruktor, der das versucht zu Lesen der header-Serialisierung aber fehl, weil der client bekommt nie dasOutputStream
zu schreiben.
Falls es hilft, hier sind die Anrufe auf die HttpsURLConnection
vor dem Aufruf von getOutputStream()
(bearbeitet, um nur die Anrufe gemacht, anstatt die gesamte Struktur der code, dies zu tun):
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setReadTimeout(30000);
conn.setRequestProperty("Cookie", cookie);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-java-serialized-object");
conn.getOutputStream();
Die Sache ist die, ich habe keine Ahnung, wie dies geschehen könnte, insbesondere angesichts der Tatsache, dass es nur passiert gelegentlich (keine klaren Muster der Aktivität, die ich sagen kann) und auch nur dann, wenn es (relativ) hohe Latenz zwischen dem client und dem server.
Gegeben, was ich habe finden können, so weit über java.net.ConnectException: Connect timed out
fragte ich mich, ob es nicht einige Netzwerk-oder firewall-Problem im Netzwerk unserer Server laufen... aber das macht nicht viel Sinn für mich gegeben, dass die Anfrage klar durchkommen an das servlet. Auch andere apps laufen auf dem gleichen Netzwerk nicht gemeldet haben ähnliche Probleme.
Hat jemand eine Idee was die Ursache sein könnte, oder was ich prüfen sollte?
- nach der "Auswertung" von bugs.sun.com/bugdatabase/view_bug.do?bug_id=6319814, java.net.ConnectException geworfen werden kann ", entweder für ein" timeout "oder" für irgendwelche andere zufällige Fehler Grund...wenn das hilft jedem
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denen wir begegnet sind, diese in einem ähnlichen Fall zu verkaufen. In der Regel bei hoher Belastung und nicht leicht zu reproduzieren auf test. Haben nicht behoben ist es noch nicht, aber dieses ist die Schritte, die wir durchgemacht haben.
Wenn es ein firewall-Problem, wir würden eine Verbindung Verweigert oder der SocketTimeout exception.
1) Sind Sie in der Lage zu verfolgen, diese Anforderungen in der access-log auf dem server - zeigen Sie ein HTTP-Statuscode 200 oder 404 oder etwas anderes? In unserem Fall, die server (IIS in diesem Fall) Protokolle zeigten, die client hat die Verbindung geschlossen, und nicht der server. So, dass war ein Geheimnis.
Update: Wenn der client bekommt immer eine 200, dann hat der server eigentlich wieder zurück geschickt, einige Antwort, aber ich vermute, das Antwort-byte-Größe (wenn diese Daten in die access-logs) zeigen einen anderen Wert aus der normalen Antwort Größe für diese Anfrage.
Wenn es zeigt die gleichen Größe der Reaktion, dann haben Sie eine (möglicherweise nicht plausibel) Bedingung, dass der server eigentlich korrekt geantwortet aber der client hat keine Antwort zurück, weil die Verbindung beendet irgendwo dazwischen.
2) Den Netzwerk-admin-teams angeschaut, die TCP/IP-Datenverkehr zu bestimmen, welche Ende (oder zwischengeschalteten router) ist die Beendigung des HTTP /TCP-IP-Gespräch. Und sobald wir verstehen, das Ende ist die Beendigung der Verbindung ist, zu schauen, warum. Jemanden knowledgable genug laufen konnte snoop
3) gibt es eine max Anzahl von Anfragen konfiguriert/beschränkt auf die server - und die ist, dass die Drosselung Ihrer verbindungen?
4) gibt es irgendwelche intermediate load Balancer bei denen nachfragen könnte fallen gelassen werden?
Update: Eine weitere Sache, die wir wollten, aber konnten nicht vollständig ist, erstellen Sie eine statische route zwischen client und server verringern die Anzahl der hops zwischen und sicherzustellen, dass keine Netzwerk Verbindung unterbrochen wird. Sehen http://en.wikipedia.org/wiki/Static_routing
5) ein Weiterer Vorschlag ist die Einstellung der ConnectTimeout zu sehen, wenn diese mit einem höheren Wert.
Update: möchten Sie vielleicht versuchen, conn.getErrorStream()
6) Könnte auch versuchen Sie, eine Reihe von thread-dumps, die auf dem server 5 Sekunden auseinander, um zu sehen, wenn jeder thread zeigt diese eingehende Anfragen auf dem server.
Update: heute haben wir gelernt zu Leben, mit diesem problem, weil wir Betrug die Ausfallrate nach 200-300 aus 400.000 Anfragen pro Tag, die 0.00075 %
SocketTimeoutException
wird ausgelöst, wenn das überschritten wird (anstatt eineConnectException
). Ich bin mir nicht sicher über die anderen Dinge, aber Sie alle scheinen eine Untersuchung Wert.URLConnection.connect()
so dass ich kann versuchen es ein paar mal, wenn es mal aus. Nicht ideal, aber wir waren noch nicht in der Lage zu bestimmen, was genau ist die Ursache HIERFÜR.