@Retryable 注释不适用于非 Spring Bean class 方法
@Retryable annotation not working for non Spring Bean class method
我是 spring-retry
的新手。基本上,为了重试对 REST API 的调用,我已将 spring-retry
集成到我的 spring-boot 应用程序中。为此,我进行了以下更改:
已将 spring-retry
添加到 pom.xml。
添加了以下配置:
@Configuration
@EnableRetry
public class RetryConfiguration {
}
终于在 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()
支持异常列表。
我是 spring-retry
的新手。基本上,为了重试对 REST API 的调用,我已将 spring-retry
集成到我的 spring-boot 应用程序中。为此,我进行了以下更改:
已将
spring-retry
添加到 pom.xml。添加了以下配置:
@Configuration @EnableRetry public class RetryConfiguration { }
终于在 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()
支持异常列表。