Java中HttpURLConnection中的连接超时

Java中HttpURLConnection中的连接超时,java,timeout,connection,httpurlconnection,Java,Timeout,Connection,Httpurlconnection,在我的一个应用程序中,我们使用HttpURLConnection访问了另一台服务器——该应用程序连续几个月运行良好,现在所有访问都突然面临连接超时。间歇性地,少数呼叫(500分之一)成功,而所有其他呼叫失败。该应用程序部署在Linux上,运行在带有Tomcat5.5的Java5上。我从命令行尝试了curl和wget,效果很好 另一个使用完全相同的代码库的Java进程能够从命令行建立连接。我们重新启动了tomcat服务器和机器,但没有成功。我们已经彻底检查了机器,没有阻塞进程/防火墙阻碍这一点(显

在我的一个应用程序中,我们使用HttpURLConnection访问了另一台服务器——该应用程序连续几个月运行良好,现在所有访问都突然面临连接超时。间歇性地,少数呼叫(500分之一)成功,而所有其他呼叫失败。该应用程序部署在Linux上,运行在带有Tomcat5.5的Java5上。我从命令行尝试了curl和wget,效果很好

另一个使用完全相同的代码库的Java进程能够从命令行建立连接。我们重新启动了tomcat服务器和机器,但没有成功。我们已经彻底检查了机器,没有阻塞进程/防火墙阻碍这一点(显然其他Java进程能够建立连接)

在间歇性突发情况下(比如一天一次),应用程序能够建立一些连接,然后返回到断开状态。从堆栈跟踪中也看不出什么

有什么建议可能会出错吗


[Update]如果服务器DNS在应用程序运行时发生更改,Java将不会检测到,并且连接将从旧IP超时(考虑到IP已关闭)。因此,在CDN的情况下,如果一个节点发生故障并被另一个IP替换,则可能会出现问题。

我也遇到过同样的问题,这是由HttpURLConnection处理keepalive引起的。当我们通过设置此系统属性禁用keepalive时,问题消失了

http.keepAlive=false

我们还有一个问题与防火墙有关。如果目标URL被防火墙阻止,则需要很长时间超时(超过2分钟)。我们必须在另一个线程中运行所有HttpURLConnection,以便在几秒钟后中断它。

您正在连接的服务是您自己的吗?某些服务(尤其是主要的RSS服务)会故意阻止频繁点击它们的用户。是的,我点击的服务是我们自己的,没有这样的加载规则:(将keepalive设置为false会导致建立更多连接。更多。这怎么可能解决连接超时?由于HttpURLConnection处理keepalive的方式,它可能会使连接处于过时状态,只是挂起。如果您关心keepalive,请将HttpClient与多线程连接管理器一起使用。