抛出java.net.UnknownHostException时检查/设置超时的位置?

时间:2013-05-17 09:31:35

标签: java tomcat httpurlconnection

抛出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

2 个答案:

答案 0 :(得分: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维护的服务器。

答案 1 :(得分:0)

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

如果主机频繁相同,请查看此帖子以配置否定ttl以缓存来自DNS的未知主机响应: any-way-to-make-java-honor-the-dns-caching-timeout-ttl