tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
606
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sebastianb sebastianb ist offline Mitglied Gold
    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
     

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    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"

  3. #3
    sebastianb sebastianb ist offline Mitglied Gold
    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
     

  4. #4
    SE Tutorials.de Gastzugang
    Versuche diese Parameter mal mit
    Code :
    1
    
    java -Dcom.sun.jndi.dns.timeout.initial=500 ... usw
    dierekt der VM zu übergeben und nicht wärend der Runtime zu setzen ...
     

  5. #5
    sebastianb sebastianb ist offline Mitglied Gold
    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:



    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);
        }
    Naja könnte man getByName interrupten, wär vieles einfacher...


    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)
     

  6. #6
    sebastianb sebastianb ist offline Mitglied Gold
    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

  1. HTTP-Keep-Alive Request
    Von nepda im Forum PHP
    Antworten: 3
    Letzter Beitrag: 27.12.08, 15:39
  2. Render Tag: Dead or Alive
    Von Yang im Forum Cinema 4D
    Antworten: 8
    Letzter Beitrag: 11.07.08, 17:40
  3. alive-signal
    Von mohi01 im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 15.11.07, 15:11
  4. Alive-Anzeige
    Von Coalminer im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 09.04.05, 12:30
  5. Datenbankstruktur und Tabellen von Host A nach Host B kopieren
    Von zeromancer im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 07.06.04, 13:00