2013-04-22 139 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/

相關問題