You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SimpleResolver是否支持多参数?Java多DNS服务器查询方案

Great question! Let's walk through your options—whether you want a ready-made solution or want to roll your own extension to SimpleResolver, you’ve got solid paths forward.

You don’t need to look far—dnsjava already has a class designed explicitly for querying multiple DNS servers: ExtendedResolver. It handles failover between servers out of the box, so you can pass a list of server addresses directly and it will try them in order until it gets a valid response.

Here’s how to use it:

import org.xbill.DNS.ExtendedResolver;
import org.xbill.DNS.Message;
import org.xbill.DNS.Record;
import org.xbill.DNS.Type;
import org.xbill.DNS.Name;
import org.xbill.DNS.DClass;

public class MultiDnsExample {
    public static void main(String[] args) throws Exception {
        // List of your DNS servers
        String[] dnsServers = {"8.8.8.8", "1.1.1.1", "9.9.9.9"};
        
        // Initialize the resolver with multiple servers
        ExtendedResolver resolver = new ExtendedResolver(dnsServers);
        
        // Create your DNS query (example: A record for google.com)
        Record queryRecord = Record.newRecord(Name.fromString("google.com."), Type.A, DClass.IN);
        Message query = Message.newQuery(queryRecord);
        
        // Send the query—ExtendedResolver handles failover automatically
        Message response = resolver.send(query);
        
        // Process the response as needed
        System.out.println("Received response from: " + resolver.getLastAddress());
        // ...
    }
}

This is the best approach for most cases because it’s maintained as part of dnsjava, includes error handling, and supports standard resolver configurations (like timeouts, ports, etc.).

Option 2: Extend SimpleResolver (For Custom Behavior)

If you need full control over how servers are prioritized, retried, or rotated (e.g., custom load balancing logic), you can create a custom Resolver implementation that wraps multiple SimpleResolver instances.

Here’s a basic example of a multi-server resolver that tries each server in sequence until it succeeds:

import org.xbill.DNS.Resolver;
import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.Message;
import org.xbill.DNS.DNSException;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;

public class MultiServerResolver implements Resolver {
    private final List<SimpleResolver> resolvers;

    // Constructor takes a list of DNS server addresses
    public MultiServerResolver(List<String> serverAddresses) throws DNSException {
        resolvers = new ArrayList<>();
        for (String addr : serverAddresses) {
            SimpleResolver resolver = new SimpleResolver(addr);
            // Configure common settings here (timeout, port, etc.)
            resolver.setTimeout(5); // 5 second timeout per server
            resolvers.add(resolver);
        }
    }

    @Override
    public Message send(Message message) throws IOException {
        IOException lastError = null;
        
        for (SimpleResolver resolver : resolvers) {
            try {
                System.out.println("Querying server: " + resolver.getAddress());
                return resolver.send(message);
            } catch (IOException e) {
                lastError = e;
                System.err.println("Failed to query " + resolver.getAddress() + ": " + e.getMessage());
            }
        }
        
        // All servers failed—throw the last encountered error
        throw lastError != null ? lastError : new IOException("No DNS servers configured");
    }

    // Delegate other Resolver interface methods to all underlying resolvers
    @Override
    public void setPort(int port) {
        resolvers.forEach(resolver -> resolver.setPort(port));
    }

    @Override
    public void setTimeout(int secs) {
        resolvers.forEach(resolver -> resolver.setTimeout(secs));
    }

    // Implement other required methods (like setTCP, setIgnoreTruncation) similarly
    @Override
    public void setTCP(boolean flag) {
        resolvers.forEach(resolver -> resolver.setTCP(flag));
    }
}

You can use this custom resolver just like any other:

import java.util.List;

public class CustomMultiDnsExample {
    public static void main(String[] args) throws Exception {
        List<String> dnsServers = List.of("8.8.8.8", "1.1.1.1");
        MultiServerResolver resolver = new MultiServerResolver(dnsServers);
        
        // Create and send your query...
        Message query = Message.newQuery(...);
        Message response = resolver.send(query);
    }
}

This gives you full flexibility to tweak the logic—for example, you could add round-robin rotation, weighted selection, or custom retry limits.

内容的提问来源于stack exchange,提问作者user1942095

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:04:22