2013-05-17 69 views
1

當java.net.UnknownHostException被引發時,檢查/設置超時?當java.net.UnknownHostException拋出時檢查/設置超時位置?

偶爾我的代碼嘗試連接到一個不存在的位置並拋出java.net.UnknownHostException什麼是我的應用程序中可接受的情況。

我遇到的問題是,在引發異常之前大約需要大約20秒,並且會降低整個應用程序的速度。

網絡服務器版本是Tomcat 7.0.37。我已經在server.xml試圖改變超時設置(以2秒)的以下接口:

Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="2000" 
Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" 

當我使用HttpURLConnection的我希望連接超時設置8080端口生效,但它似乎沒有不是真實的。

我也試圖設置代碼中的超時:

但這並沒有工作,沒有任何想法?我錯過了什麼嗎?

TA

+0

你一般工作一個緩慢的互聯網連接?如果是這樣,你是否嘗試增加超時時間?嘗試在高速連接上進行測試。如果問題仍然存在,那麼在你的邏輯中可能會產生太多的線程問題。 – vasanth

+1

您的DNS配置錯誤。解決這個問題。 – EJP

+0

@ user927258如何增加超時將幫助我減少等待引發java.net.UnknownHostException所花費的時間? – LuckyAshnar

回答

1

時間大概花在查找在DNS主機,而你的情況似乎在嘗試查找無法找到主機時要進行超時。如果您連接的DNS服務器將請求轉發到另一個DNS服務器,並且在合理的時間內沒有得到回覆,可能是因爲它沒有正確配置,就會發生這種情況。

您可以通過提前使DNS查找超時來解決操作系統級別的此問題;例如在Linux中,您可以將options timeout:2添加到/etc/resolv.conf以使DNS查找在2秒內超時而不是默認值。在Windows上,您必須edit a registry setting

或者,您可以通過using a thread for the name resolution在您的程序中解決此問題。如果線程在超時未返回,則指定您假定名稱解析將拋出UnknownHostException

第三種選擇是使用不同的,性能更好的DNS服務器,就像Google在8.8.8.8和4.4.4.4中維護的那樣。

+0

感謝您的想法,在我看來,它確實是DNS的問題。總結默認時間DNSQueryTimeouts(在「編輯註冊表設置」中給出)給出了17秒,這將解釋爲什麼如果不可用的主機被調用,我正在等待該時間的動作。 – LuckyAshnar

+0

另一種選擇是如果可以,則使用不同的DNS服務器。 8.8.8.8(由Google維護)速度相當快,不會讓你等待告訴你他們是否無法解析名稱。來想一想,我會把這個添加到答案中。 – Joni

0

你面對的問題是DNS解析問題,而不是Java問題,我猜你的程序在DNS查詢期間被阻止。嘗試在shell中的未知主機上執行nslookup以查看是否重現該問題。如果您是這樣,請問您的系統管理員在出現問題時查看DNS服務器日誌和配置。

如果主機經常是相同的,看看這個帖子配置負的TTL值緩存來自DNS未知宿主反應: any-way-to-make-java-honor-the-dns-caching-timeout-ttl