【问题标题】:FeignException with status 0?FeignException 状态为 0?
【发布时间】:2020-09-04 14:55:59
【问题描述】:

我收到一个 FeignException(RetryableException) 状态 0 而不是 HTTP 500 或 504 超时问题。

在 Postman 中,我得到 HTTP 状态 500。

为什么 FeignException 的状态为 0?

【问题讨论】:

  • 因为读取超时与 HTTP 500 状态不同。如果您遇到读取超时,则根本没有响应,更不用说 HTTP 500。

标签: java feign


【解决方案1】:

根据证据,您基于 Postman 的 web 应用正在使用 Feign 尝试与其他一些服务通信。当 Feign 尝试连接到服务时,无论是在连接尝试期间还是在等待响应期间都会超时。

在任何一种情况下,读取超时都意味着 Feign 没有得到 HTTP 响应。由于状态码来自该响应,因此FeignException 中没有 HTTP 状态码。

您的 Postman 应用程序代码显然没有处理 FeignException,因此它正在传播到 Postman 堆栈,该堆栈正在将其(正确)转换为 HTTP 500(内部错误)。

简而言之,Feign 没有传递 HTTP 状态码,因为它没有得到一个。 (而且无论如何都没有表示“请求超时”的 HTTP 状态代码。)


更新

我需要处理我的假客户端的所有异常消息/状态。为此,我为 FeignException 设置了一个 try/catch。这个异常是由 feign 在 readtimeout 超过 XXX 时间时创建的。我不知道我怎样才能得到邮递员得到的状态 500 而不是 0。

我认为您正在尝试解决错误的问题。

当响应不存在时,您希望从响应中获取 HTTP 状态。显然你不能得到不存在的东西。或者,在这种情况下,您希望假装 fake 响应代码。显然不是。

正如我上面解释的,邮递员给出的 500 错误不是你的假请求的响应代码。这是 Postman 为您的网络应用程序生成的响应代码。这是一个“内部错误”,您的代码允许 FeignException 在超时的情况下传播!

因此,如果您想诊断/处理 try/catch 中的超时,您需要专门测试异常处理程序中的 status == 0。然后你可以:

  • 将所有响应代码为零的情况视为未诊断错误。

  • 测试ex.getMessage() 以查看它是否包含“超时”或“超时”或类似内容。 (请注意,测试异常消息的特定内容会使您的代码可能脆弱或依赖于平台。但这可能不是您关心的问题。)

  • 测试ex.getCause(),查看原因异常是否指示超时、“连接被拒绝”或其他。

【讨论】:

  • 我需要处理我的假客户的所有异常消息/状态。为此,我为 FeignException 设置了一个 try/catch。此异常是在 readtimeout 超过 XXX 时间时通过馈送创建的。我不知道如何获得邮递员获得的状态 500 而不是 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2012-06-13
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多