@Retryable 注释不适用于非 Spring Bean class 方法

@Retryable annotation not working for non Spring Bean class method

我是 spring-retry 的新手。基本上,为了重试对 REST API 的调用,我已将 spring-retry 集成到我的 spring-boot 应用程序中。为此,我进行了以下更改:

  1. 已将 spring-retry 添加到 pom.xml。

  2. 添加了以下配置:

    @Configuration
    @EnableRetry
    public class RetryConfiguration {
    }
    
  3. 终于在 class 中添加了 @Retryable 注解(这个 class 不是 Spring Bean)方法,我希望重试各种例外情况如下:

    public class OAuth1RestClient extends OAuthRestClient {
    
      @Override
      @Retryable(maxAttempts = 3, value = {
         Exception.class},
         backoff = @Backoff(delay = 100, multiplier = 3))
      public Response executeRequest(OAuthRequest request)
          throws InterruptedException, ExecutionException, IOException {
         System.out.println("Inside Oauth1 client");
         return myService.execute(request);
      }
    

现在,executeRequest 方法不会重试。我无法理解我是否遗漏了这里的任何内容。

有人可以帮忙吗?谢谢。

如果您的 class 未被 Spring 管理(例如 @Component/@Bean) @Retryable 的注释处理器不会拾取它。

您始终可以手动定义 retryTemplate 并用它包装调用:

RetryTemplate.builder()
        .maxAttempts(2)
        .exponentialBackoff(100, 10, 1000)
        .retryOn(RestClientException.class)
        .traversingCauses()
        .build();

然后

retryTemplate.execute(context -> myService.execute(request));

如果您想重试多个异常,可以通过自定义 RetryPolicy

Map<Class(? extends Throwable), Boolean> exceptionsMap = new HashMap<>();
exceptionsMap.put(InternalServerError.class, true);
exceptionsMap.put(RestClientException.class, true);

SimpleRetryPolicy policy = new SimpleRetryPolicy(5, exceptionsMap, true); 
RetryTemplate.builder()
        .customPolicy(policy)
        .exponentialBackoff(100, 10, 1000)
        .build();

仅供参考:RetryTemplate 正在阻塞,您可能想探索一种非阻塞异步重试方法,例如 async-retry。 - retryOn() 支持异常列表。