2010-07-29 21 views
7

Wenn java.net.Socket.connect() verwenden, die beide eine Verbindung verweigert und ein Timeout-Ergebnis in einem ConnectException.Unterscheiden zwischen Verbindung abgelehnt und Verbindungszeitüberschreitung

java.net.ConnectException: Connection timed out: connect 

java.net.ConnectException: Connection refused: connect 

Wie kann ich sicher zwischen den beiden unterscheiden? Sicheres Parsen der Fehlermeldung erledigt den Job. Aber wenn sich die Nachricht in einer zukünftigen Java-Version ändert, habe ich kein Glück.

Das größere Bild: Ich schreibe einen Web-Service-Client mit JAX-WS mit einer Metro-Implementierung. Wenn ein Web-Service-Aufruf fehlschlägt, möchte ich den Grund für den Fehler klar melden, damit das Problem schnell behoben werden kann.

Antwort

2

Leider werden diese Informationen im Sun JDK nicht überall verfügbar gemacht, außer in der Zeichenfolge. Siehe Zeile 473 von PlainSocketImpl.c (für * ix) und net_util_md.c (für Windows). Die * ix-Implementierung ruft manchmal NET_ThrowByNameWithLastError (von * ix net_util_md.c) auf, das errno in der Zeichenfolge enthalten wird; Diese Funktion gibt es unter Windows, aber es ist hier nicht verwendet ..

So müssen Sie auf den Saiten verlassen und hoffen, dass sie sich nicht ändern. Sun scheint sie nicht zu lokalisieren, was sinnvoll ist, weil sie nicht benutzerorientiert sein sollen. Sie können versuchen, das errno für einen stabileren Fehlercode zu analysieren.

Sie sollten auch sicher sein, einen Fallback zu haben, falls keine Zeichenfolge oder Fehlernummern übereinstimmen.

+0

Ein Fallback ist eine akzeptable Lösung. –

+0

Ich mag diese Antwort, aber behalte meinen früheren Vorschlag: abstrahiere es weg! Das letzte, was Sie wollen, ist eine Reihe von inkonsistenten und wiederholten Überprüfungen einer Schnittstelle, auf die Sie sich nicht verlassen können. Erstellen Sie eine für Sie sinnvolle Oberfläche und abstrahieren Sie die Details. Sie möchten nicht ein Dutzend Dateien bearbeiten, wenn sich etwas ändert. – riwalk

0

Überprüfen Sie die Fehlermeldung (wie Sie erwähnt haben), aber abstrahieren Sie sie.

Wenn es sich in einer zukünftigen Java-Version ändert, ändern Sie es in der Abstraktion und lassen den Kern Ihres Codes in Ruhe.

+1

Dies wird sofort unterbrochen, wenn die JVM Nachrichten lokalisiert hat. –

3

Messen Sie die Zeit zwischen dem Aufrufen von connect() und dem Auslösen der Ausnahme und übergeben Sie diese Informationen weiter.

Verwandte Themen