2

抛出 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 的连接超时设置生效,但似乎并非如此。

我还尝试在代码中设置超时:

HttpURLConnection connection = (HttpURLConnection)url.openConnection();  
connection.setConnectTimeout(1000);  
Reader reader= new InputStreamReader((InputStream) connection.getContent());

但这也不起作用,有什么想法吗?我错过了什么吗?

ta

4

2 回答 2

1

时间可能花在在 DNS 中查找主机上,在您的情况下,这似乎在尝试查找无法找到的主机时超时。如果您连接的 DNS 服务器将请求转发到另一台 DNS 服务器,并且在合理的时间内没有得到回复,可能是因为配置不正确,就会发生这种情况。

你可以在操作系统层面通过提前设置DNS查找超时来解决这个问题;例如,在 Linux 中,您可以添加options timeout:2/etc/resolv.conf使 DNS 查找在 2 秒内超时,而不是默认值。在 Windows 上,您必须编辑注册表设置

或者,您可以在程序中使用名称解析线程来解决此问题。如果线程在超时后没有返回,您指定您假设名称解析将抛出一个UnknownHostException.

第三种选择是使用不同的、性能更好的 DNS 服务器,例如 Google 在 8.8.8.8 和 4.4.4.4 维护的那些。

于 2013-05-17T09:50:00.060 回答
0

您面临的问题是 DNS 解析问题而不是 Java 问题,我猜您的程序在 DNS 查询期间被阻止。尝试在 shell 内对未知主机执行 nslookup 以查看是否重现问题。如果是,请让您的系统管理员查看 DNS 服务器日志和配置是否有问题。

如果主机经常相同,请查看这篇文章以配置负 ttl 以缓存来自 DNS 的未知主机响应: any-way-to-make-java-honor-the-dns-caching-timeout-ttl

于 2013-05-17T09:52:55.183 回答