Spring Retry

- 1 min read

Series: spring-boot

Spring Retry

在日常开发中,我们经常会遇到一些需要重试的场景,比如调用第三方服务时,由于网络等原因导致调用失败,这时我们可以通过重试的方式来提高成功率。Spring Retry 是 Spring 的一个子项目,它提供了一种简单的重试机制,可以帮助我们在调用失败时进行重试。

依赖

    <dependency>
      <groupId>org.springframework.retry</groupId>
      <artifactId>spring-retry</artifactId>
    </dependency>

    <!-- 如果使用注解方式需要 aop 相关依赖-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

使用

1. 注解方式

import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

/**
 * RetryService
 */
@Service
public class RetryService {

    /**
     * 重试方法
     * retryFor: 出现异常时重试
     * maxAttempts: 最大重试次数
     * @param t
     */
    @Retryable(retryFor = RuntimeException.class, maxAttempts = 3)
    public void sayHi(boolean t) {
        System.out.println("say hi");
        if (t) {
            throw new RuntimeException("error");
        }
    }

    /**
     * 重试失败后执行的方法
     * @param e
     */
    @Recover
    public void recover(RuntimeException e) {
        System.out.println("recover");
    }
}

2. 编程方式

RetryTemplate retryTemplate = RetryTemplate.builder()
        .maxAttempts(3) // 最大重试次数
        .fixedBackoff(100) // 重试间隔
        .retryOn(RuntimeException.class) // 出现异常时重试
        .build();

String result = retryTemplate.execute(context -> {
    System.out.println("retryTemplate");
    if (context.getRetryCount() < 3) {
        throw new RuntimeException("retryTemplate");
    }
    return "ok";
}, context -> {
    System.out.println("recover");
    return "recover";
});

总结

Spring Retry 提供了一种简单的重试机制,可以帮助我们在调用失败时进行重试。它支持注解方式和编程方式,可以根据实际需求选择合适的方式来使用。

个人推荐使用编程方式,更加灵活,偶合度更低,更容易控制。需要修改调用逻辑时,可以在 lambda 中进行修改。旧项目中调用第三方服务时,可能已经有了一些重试逻辑不够优雅,这时可以使用编程方式来进行替换,不需太多修改。

参考

Spring Retry