e.printStackTrace(); close();
logger.log(Level.WARNING, "run() exception " , e); recover();
        public void run() {            try {                if (state == DNSState.ANNOUNCED) {                    if (count++ < 3 && ! info.hasData()) {                        long now = System.currentTimeMillis();                        DNSOutgoing out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY);                        out.addQuestion(new DNSQuestion(info.getQualifiedName(), DNSConstants.TYPE_SRV, DNSConstants.CLASS_IN));                        out.addQuestion(new DNSQuestion(info.getQualifiedName(), DNSConstants.TYPE_TXT, DNSConstants.CLASS_IN));                        if (info.server != null) {                            out.addQuestion(new DNSQuestion(info.server, DNSConstants.TYPE_A, DNSConstants.CLASS_IN));                        }                        out.addAnswer((DNSRecord) cache.get(info.getQualifiedName(), DNSConstants.TYPE_SRV, DNSConstants.CLASS_IN), now);                        out.addAnswer((DNSRecord) cache.get(info.getQualifiedName(), DNSConstants.TYPE_TXT, DNSConstants.CLASS_IN), now);                        if (info.server != null) {                            out.addAnswer((DNSRecord) cache.get(info.server, DNSConstants.TYPE_A, DNSConstants.CLASS_IN), now);                        }                        send(out);                    } else {                        // After three queries, we can quit.                        cancel();                        removeListener(info);                    };                } else if (state == DNSState.CANCELED) {                    cancel();                    removeListener(info);                }            } catch (Throwable e) {                e.printStackTrace();                close();            }        }