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

标签 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());

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

最佳答案

时间可能花在了在 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 维护的服务器。

关于java - 抛出 java.net.UnknownHostException 时在哪里检查/设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605784/

相关文章:

java - JSP 页面无法工作 : java. lang.ClassNotFoundException : org. apache.jsp 和 useBean 类属性的值无效

java - xmlhttprequest 获取加密 key + html 表单 - 我做错了什么

java - HttpUrlConnection 是否存在并发惩罚?

android - 我该如何解决 - 无法解析符号执行

java - 在 Postgres 和 Java 中将字符串转换为 UUID

java - Thread.sleep 不工作 Android

tomcat - 无法加载此 JVM TI 代理两次

java - 选择不能在任何服务器上运行

java - itext多重签名

java - HtmlUnit 仅显示 GWT 应用程序的主机 HTML 页面