Java中HttpURLConnection的连接超时设置过于荒谬

3
在我的一个应用程序中,我们使用HttpURLConnection访问另一台服务器 - 应用程序运行良好数月,现在突然所有访问都面临连接超时。零星地,少数调用(500个中的1个)成功,而其他所有调用都失败。该应用程序部署在运行Java 5和Tomcat 5.5的Linux上。我尝试了从命令行使用curl和wget,它们可以正常工作。
另一个使用完全相同代码库的Java进程能够从命令行建立连接。我们已经重启了Tomcat服务器以及机器,但无济于事。我们已经彻底检查了机器,没有阻止进程/防火墙干扰此操作(其他Java进程能够建立连接,这很明显)。
在间歇性的爆发中(比如一天一次),该应用程序能够建立几个连接,然后返回到破损状态。从堆栈跟踪中也没有发现太多明显的问题。
您有任何建议吗?
[更新] 如果应用程序正在运行时服务器DNS更改,则Java将无法检测到并且连接将从旧IP超时(假设IP已关闭)。因此,在CDN的情况下,如果一个节点失效,并被另一个IP替换,则可能会出现问题。

你所连接的服务是自己的服务吗?一些服务(尤其是主要的 RSS 服务)会有意地阻止过于频繁访问它们的用户。 - Quotidian
是的,我正在访问的服务是我们自己的,没有这样的负载规则 :( - sangupta
1个回答

5

我曾经遇到过同样的问题,这是由于HttpURLConnection对keepalive的处理引起的。当我们通过设置该系统属性来禁用keepalive时,问题就解决了。

http.keepAlive=false

我们有另一个与防火墙相关的问题。如果目标URL被防火墙阻止,将需要很长时间才能超时(超过2分钟)。因此,我们必须在另一个线程中运行所有的HttpURLConnection,这样我们就可以在几秒钟后中断它。


将keepalive设置为false会导致更多的连接被建立。非常多。那怎么可能解决连接超时的问题呢? - user207421
由于HttpURLConnection处理keepalive的方式,它可能会使连接处于僵化状态并卡死。如果您关心keepalive,请使用具有多线程连接管理器的HttpClient。 - ZZ Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接