feign.RetryableException 包含哪些异常?

What exceptions does feign.RetryableException wrap?

文档告诉我 HTTP 503 响应被认为是可重试的,一些例外也是如此。

根据经验,我知道 feign.RetryableException 包裹着 java.net.ConnectException,另一个包裹着 j.n.SocketExceptions,但我看不出这是在哪里发生的。

其他人像java.net.SocketTimeoutException被feign.RetryableException包裹了吗?

您可以查看feign.SynchronousMethodHandler中的代码:

try {
  response = client.execute(request, options);
} catch (IOException e) {
  if (logLevel != Logger.Level.NONE) {
    logger.logIOException(metadata.configKey(), logLevel, e, elapsedTime(start));
  }
  throw errorExecuting(request, e);
}


static FeignException errorExecuting(Request request, IOException cause) {
  return new RetryableException(
      format("%s executing %s %s", cause.getMessage(), request.httpMethod(), request.url()),
      request.httpMethod(),
      cause,
      null);
}

所以如果异常扩展 IOException 那么它将被包装。

在 Feign 中,IOExceptions 是唯一自动包装的异常。如果还有其他情况需要调用 Feign 的重试功能,请创建一个 ErrorDecoder 和 return 一个 RetryableException。有关示例,请参阅 Feign Documentation.