3

在我的一个应用程序中,我们使用 HttpURLConnection 访问了另一台服务器 - 该应用程序运行了几个月,但现在突然所有命中都面临连接超时。间歇性地,少数调用(500 次中的 1 次)成功,而其他所有调用均失败。该应用程序部署在运行 Java 5 和 Tomcat 5.5 的 Linux 上。我已经从命令行尝试了curlwget ,它们工作正常。

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

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

有什么建议可能会出错吗?

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

4

1 回答 1

5

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

http.keepAlive=false

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

于 2010-06-08T17:23:34.343 回答