2013-04-22 140 views
1

我想使用ExecutorService框架解析一些DNS任务。 我使用java API进行DNS查询: 1/java.net.InetSocketAddress.InetSocketAddress(String,int) - 名称查找 2/java.net.InetAddress.getByName(String) - 名称查找 3/java.net .InetAddress.getHostName() - 反向名称查找如何处理不可中断的阻塞(ExecutorService)

一个典型的DNS任务将是这样定义的可调用对象的

public class IpAddressResolver extends DnsCallable<String, InetAddress> { 

    public IpAddressResolver(String host) { 
     super(host); 
    } 

    public InetAddress call() throws Exception { 
     return InetAddress.getByName(target); 
    } 

} 

正如你可以看到这3个电话都不可中断。 问题是,如果Future.get(long, TimeUnit)超时,然后我打电话Future.cancel(boolean)我没有任何机会来阻止工作线程试图解决DNS任务(我已在和文件中测试了该文件以便模拟长时间运行DNS查询)。

这样做的结果是,如果当前正在运行的工作线程无法停止,那么当我提交另一个DNS任务时,则必须创建第二个线程,对于第三个任务我将有第三个线程等。如果DNS服务器没有响应,那么我会在池中有一堆无用的线程(即等待超时*尝试= 150秒后发出的负面DNS响应)。

恐怕如果创建多个线程,并在线程池(我用的BTW一个缓存的线程池)活跃,我将不得不对付另一种问题...

我知道,一个不可中断的阻塞套接字读取调用可以通过关闭底层套接字来阻止,但我的情况并非如此。

有谁知道如何处理这类问题?

回答

1

DNS查询调用由系统调用完成。所以,Java不能打断它。唯一的方法是创建一个线程池,并希望不好的请求不会经常溢出线程池。或者用适当的超时调整您的resolv.conf。在Java中你无能为力。

作为替代方案,您可能会寻找一种纯粹的java dns客户端实现,它很可能会被中断。例如。快速谷歌搜索显示:http://sourceforge.net/p/dnsjava/

相关问题