一尘不染

抛出java.net.UnknownHostException时在哪里检查/设置超时?

tomcat

抛出java.net.UnknownHostException时在哪里检查/设置超时?

有时我的代码尝试连接到不存在的位置,并抛出java.net.UnknownHostException在我的应用程序中可以接受的情况。

我的问题是,抛出异常大约需要20秒钟,这会减慢整个应用程序的速度。

Web服务器版本是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


阅读 353

收藏
2020-06-16

共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中维护的服务器。

2020-06-16