【问题标题】:Absurd connection timeout in HttpURLConnection in JavaJava中HttpURLConnection中的荒谬连接超时
【发布时间】:2011-03-01 06:14:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您要连接的服务是您自己的吗?一些服务(尤其是主要的 RSS 服务)会故意阻止那些过于频繁点击它们的用户。
  • 是的,我打的服务是我们自己的,没有这样的加载规则:(

标签: java timeout connection httpurlconnection


【解决方案1】:

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

http.keepAlive=false

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

【讨论】:

  • 将 keepalive 设置为 false 会导致建立 更多 个连接。还有很多。这怎么可能解决连接超时?
  • 由于 HttpURLConnection 处理 keepalive 的方式,它可以使连接处于简单挂起的陈旧状态。如果您关心keepalive,请使用带有多线程连接管理器的HttpClient。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多