ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
606
606
EMPFEHLEN
-
26.09.11 16:59 #1
- Registriert seit
- Dec 2009
- Beiträge
- 125
Hallo zusammen,
ich schreibe gerade ein kleines Diagnose-Tool mithilfe dessen ich u.a. überprüfen will ob bestimmte Hosts innerhalb eines gewissen Schwellwertes erreichbar sind:
Code java:1
boolean alive = InetAddress.getByName("www.heise.de").isReachable(1000)
Eigentlich ja kein Hexenwerk - bekomme ich innerhalb von 1000ms kein Response ist alive = false.
Mein Problem ist nun, das wenn der Hostname nicht aufgelöst werden kann das Programm für rund 10s steht und dann erst eine UnknownHostException wirft.
Kenn jemand von euch eine Möglichkeit für die getbyName-Methode einen Timeout zu definieren oder eine andere Möglichkeit einen Hostname aufzulösen?
Viele Grüße
Sebastian
-
26.09.11 17:29 #2
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
hab nur ein ähnliches Problem gefunden, eventuell kannst du das wie in folgendem Bugreport beschrieben auch für dich brauchen: Bug #4630910
(Ungetestet, Probiers einfach mal aus
)
Gruß
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
27.09.11 09:07 #3
- Registriert seit
- Dec 2009
- Beiträge
- 125
Hey,
danke für den Tipp. Die Lösung sieht zwar echt gut aus, funktionier aber leider nicht :/
Code java:1 2 3 4 5 6 7
System.setProperty("com.sun.jndi.dns.timeout.initial", "500"); // Keine Auswirkung System.setProperty("com.sun.jndi.dns.timeout.retries", "1"); // Keine Auswirkung long before = System.currentTimeMillis(); InetAddress host = Inet4Address.getByName("www.google.deXX"); System.out.println(System.currentTimeMillis() - before); System.out.println(host.isReachable(1000));
Gruß
Sebastian
-
27.09.11 23:36 #4SE Tutorials.de Gastzugang
Versuche diese Parameter mal mit
dierekt der VM zu übergeben und nicht wärend der Runtime zu setzen ...Code :1
java -Dcom.sun.jndi.dns.timeout.initial=500 ... usw
-
28.09.11 10:46 #5
- Registriert seit
- Dec 2009
- Beiträge
- 125
Hey Spike,
danke für den Tipp aber leider hatte diese Änderung auch keinerlei Effekt auf die Namensauflösung.
Ich habe hier nun eine extremst hässliche Methode um die Namensauflösung nach einem vorgegebenen Timeout zu unterbrechen:
Naja könnte man getByName interrupten, wär vieles einfacher...Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
public InetAddress resolveHostname(final String hostname, final int timeout) { final Object token = new Object(); List<InetAddress> list = new ArrayList<InetAddress>(1); class Resolver implements Runnable { private List<InetAddress> list; public Resolver(List<InetAddress> list) { this.list = list; } @Override public void run() { try { list.add(Inet4Address.getByName(hostname)); } catch (UnknownHostException e) { // Ignore } synchronized (token) { token.notify(); } } } new Thread(new Resolver(list)).start(); synchronized (token) { try { token.wait(timeout); } catch (InterruptedException e) { // Ignore } } return (list.size() == 1) ? list.get(0) : null; } public static void main(String[] args) throws Exception { InetAddress host = new TestClass().resolveHostname("www.google.de", 50); System.out.println(host); }
Hier noch ein paar Sonderheiten:
F: Warum eine innere Klasse und nicht eine anonyme Klasse (new Runnable(){...}) ?
A: Eine Anonyme Klasse kann keinen Parameterbehafteten Konstruktor enthalten
F: Warum wird die InetAddress (host) in ein ArrayList gepackt?
A: Das wüsste ich auch gerne aber wenn ich dem Konstruktor direkt ein InetAddress übergebe und dieses dann in der Run-Methode setze ist es nach der Ausführung in der äußeren Methode immer null Oo. In einer ArrayList verpackt gehts aber? WTF?
F: Warum so hässlich?
A: Kein Nerv mehr
Geändert von sebastianb (28.09.11 um 13:07 Uhr)
-
29.09.11 10:01 #6
- Registriert seit
- Dec 2009
- Beiträge
- 125
So ich habs eben aus Spaß nochmal getestet und jetzt gehts auch so:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
public InetAddress resolveHostname(final String hostname, final int timeout) { final Object token = new Object(); InetAddress[] host = new InetAddress[1]; class Resolver implements Runnable { private InetAddress[] host; public Resolver(InetAddress[] host) { this.host = host; } @Override public void run() { try { host[0] = Inet4Address.getByName(hostname); } catch (UnknownHostException e) { // Ignore } synchronized (token) { token.notify(); } } } new Thread(new Resolver(host)).start(); synchronized (token) { try { token.wait(timeout); } catch (InterruptedException e) { // Ignore } } return host[0]; } public static void main(String[] args) throws Exception { InetAddress host = new TestClass().resolveHostname("www.google.de", 10); System.out.println(host); }
Falls jemand eine bessere Lösung kennt, darf er mir die gerne mitteilen
Gruß Sebastian
Ähnliche Themen
-
HTTP-Keep-Alive Request
Von nepda im Forum PHPAntworten: 3Letzter Beitrag: 27.12.08, 15:39 -
Render Tag: Dead or Alive
Von Yang im Forum Cinema 4DAntworten: 8Letzter Beitrag: 11.07.08, 17:40 -
alive-signal
Von mohi01 im Forum C/C++Antworten: 6Letzter Beitrag: 15.11.07, 15:11 -
Alive-Anzeige
Von Coalminer im Forum C/C++Antworten: 4Letzter Beitrag: 09.04.05, 12:30 -
Datenbankstruktur und Tabellen von Host A nach Host B kopieren
Von zeromancer im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 07.06.04, 13:00





Zitieren

Login





