【问题标题】:Apache HTTP client timeoutApache HTTP 客户端超时
【发布时间】:2017-08-30 14:17:52
【问题描述】:

我正在使用 Apache HTTP 客户端联系外部服务。该服务可能需要几个小时甚至更长的时间才能生成响应。我尝试了一些不同的事情,但要么以套接字或读取超时而告终。我刚刚尝试使用 RequestConfig 将套接字和连接超时设置为 0,根据文档,这应该是无限的,但请求总是在 1 小时后返回。有什么想法吗?

【问题讨论】:

  • 您是否从多个平台和/或位置进行了测试,所以这不是防火墙或操作系统问题?
  • 几个小时?这不是你通过延长超时来解决的问题。
  • @Kayaman 建议?
  • 我们会说修复外部服务,但我猜你不能出于某种原因。找到写这篇文章的人并用砖头砸他们?
  • @Kayaman 哈哈,是的,不幸的是,这不是一个选择(修复服务或用砖头打他们)。

标签: java rest apache-httpclient-4.x


【解决方案1】:

我同意不要试图让 HTTP 连接保持活动这么长时间的一般观点,但是,如果你束手无策,你可能会发现你在 TCP 中遇到了超时,而 TCP 级别的保持活动可能会挽救这一天。

请参阅此链接以获取有关设置 TCP 保持活动的帮助,您无法在 HttpClient 中执行此操作,它是操作系统的事情,这将定期发送 ACK,因此即使 HTTP 流中没有发生任何事情,您的 TCP 连接也永远不会空闲。

Apache HttpClient TCP Keep-Alive (socket keep-alive)

即使 TCP 连接处于活动状态,也很难长时间保持这些连接。 YMMV。

【讨论】:

    【解决方案2】:

    理想情况下,任何需要超过几分钟(2-3 分钟左右)的服务都应该异步处理,而不是保持连接打开一个小时左右。浪费客户端和服务器端的资源。

    替代方法可以解决这类问题。

    1. 您调用服务来触发处理(准备响应)。它可能会返回一些唯一的请求 ID。
    2. 然后大约一个小时后(一旦响应准备好响应),客户端通过传递请求 ID 再次请求,服务器返回响应。
    3. 其他替代方法可能是,一旦响应准备好,它将响应推回回调 URL 或客户端托管另一个服务,专门用于接收服务器准备的响应(步骤 #1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2014-05-16
      • 2012-11-14
      • 2017-08-30
      相关资源
      最近更新 更多