0

我正在玩一个非常基本的客户端<->服务器项目以获得乐趣,并且认为如果无法访问主服务器,那么实现一个后备系统会很好。我打算通过 SRV 记录查找来做到这一点。

对于它的价值,这就是我获取 SRV 记录的方式..

String query = "_test._tcp.my.domain.com";
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
environment.put("java.naming.provider.url", "dns:");
InitialDirContext dirContext = new InitialDirContext(environment);
Attributes records = dirContext.getAttributes(query, new String[] {"SRV"});

所以我设置了一些 SRV 记录,所有这些,代码都能很好地检索它们。我不知道的是,在建立一个正确排序记录的列表后,我怎样才能找到要使用的记录?

我知道我可以只连接到最低优先级记录的主机/端口,如果失败,则转到下一个,等等。但是如果有相当数量的记录并且只有一个具有最高优先级的记录工作怎么办?无论谁使用客户端,都必须等待每个低优先级记录连接超时,然后才能最终找到一个有效的连接。

我要做的是无缝地找到工作主机/端口的记录,因为用户不必等待可能的年龄。

4

1 回答 1

0

You can start connections in separate threads, and just wait until one will complete.

Please consider using http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CompletionService.html

So in short:

  • implement callable to return desired value
  • create completion service
  • submit jobs to it
  • call completionService.poll
  • cancel all tasks in completion service
于 2012-08-29T14:08:31.600 回答