What Is @Retry in Spring?

Simply put

In Spring, @Retry is an annotation that allows you to specify that a method should be retried if it fails due to certain exceptions. This annotation is part of Spring's retry support, which provides a declarative way to handle transient failures by automatically retrying failed operations.

Here's how you can use @Retry in Spring:

  • Annotate the Method: You annotate the method you want to retry with @Retry.

  • Configure Retry Behavior: You can configure the behavior of the retry by specifying parameters such as the maximum number of retry attempts, the types of exceptions that trigger a retry, and the backoff strategy between retry attempts.

  • Enable Retry Configuration: You need to enable retry configuration in your Spring application context either through XML configuration or Java configuration.

Configuration

  • @EnableRetry: This annotation is used to enable Spring's support for retrying failed method invocations. By default, Spring's retry support is not enabled, so you need to annotate a configuration class with @EnableRetry to activate it. Setting proxyTargetClass to true indicates that the proxying mechanism should use class-based proxies instead of interface-based ones.

  • @Retryable: This annotation is used to indicate that a method should be retried if it fails. You can specify the types of exceptions that should trigger a retry, the maximum number of attempts, and the backoff strategy to be used between attempts. In your example, it retries for any exception (Exception.class), allows a maximum of 3 attempts (maxAttempts = 3), and uses a fixed backoff strategy with a delay of 2000 milliseconds between retries (backoff = @Backoff(2000)).

  • @Backoff: This annotation, used in conjunction with @Retryable, specifies the backoff strategy to use between retry attempts. In your example, it uses a fixed backoff strategy with a delay of 2000 milliseconds between retry attempts.

  • @Recover: This annotation is used in conjunction with @Retryable to specify a method that should be invoked if all retry attempts fail. The method annotated with @Recover should have a compatible signature with the retryable method and should be able to handle the same exceptions. When all retry attempts are exhausted, the @Recover-annotated method will be invoked to handle the failure.

Example

java 复制代码
@Service
public class RetryService {
	AtomicInteger COUNTER = new AtomicInteger(0);
    @Retryable(retryFor = Exception.class, maxAttempts = 3, backoff = @Backoff(2000),
                recover = "recover")
    public String calling3rdPartyAPI() throws Exception {
        COUNTER.incrementAndGet();
        if(COUNTER.get() == 1 || COUNTER.get() == 2 || COUNTER.get() == 3) {
            System.out.println("COUNTER = " + COUNTER);
            throw new Exception("Forcefully Exception ");
        }
        return "SUCCESS";
    }
    //this method will call after all attempt is getting over
     @Recover
     public String recover(Exception e) {
      System.out.println("Recover method called after all retry attempt and still getting error");
         return "Error Class :: " + e.getClass().getName();
     }
}

Notice that

Using @Retryable with idempotent methods is generally safe as long as the method's logic remains consistent across retries. Idempotent methods produce the same result regardless of how many times they are executed with the same inputs.


See

https://docs.spring.io/spring-batch/docs/4.1.x/reference/html/retry.html

https://medium.com/@vivekkadiyanits/retryable-a-retry-pattern-of-spring-boot-bf85290b8404

相关推荐
yxlalm2 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
Tangyuewei8 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
名字还没想好☜11 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
ly768913 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
Bs_MoneyMagnet16 小时前
基于springboot+vue的家居生活商城平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
ly768917 小时前
Spring 事件机制在微服务中实现最终一致性的设计
java·spring·微服务·异步处理·最终一致性·spring事件·事务事件
Bs_MoneyMagnet17 小时前
基于springboot+vue的医院陪诊服务预约平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
青春易逝丶17 小时前
SpringDataJPA
java·spring·hibernate
流烟默17 小时前
xxl-job 接入 Spring 的两种方式:手动装配与自动装配(含 initMethod 双启动踩坑实录)
java·spring·xxl-job
谢亮_vipxieliang18 小时前
ValidX与Maven/Gradle集成配置指南
java·spring boot·spring·maven·hibernate