跳至主要內容

Spring-重试机制

holic-x...大约 2 分钟JAVA框架

Spring-重试机制

学习核心

  • Spring Retry重试机制

学习资料

基于Springboot项目的重试机制demo

​ 在调用第三方接口或者使用mq时,会出现网络抖动,连接超时等网络异常,所以需要重试。为了使处理更加健壮并且不太容易出现故障,后续的尝试操作,有时候会帮助失败的操作最后执行成功。例如,由于网络故障或数据库更新中的DeadLockLoserException导致Web服务或RMI服务的远程调用可能会在短暂等待后自行解决。 为了自动执行这些操作的重试,Spring Batch具有RetryOperations策略。不过该重试功能从Spring Batch 2.2.0版本中独立出来,变成了Spring Retry模块

项目构建&引入依赖(retry、aspectweaver)

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

配置开启重试机制(@EnableRetry

@EnableRetry
@SpringBootApplication
public class SpringbootRetryDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRetryDemoApplication.class, args);
    }

}

Service

@Service
public class PayService {

    private static final Logger log = LoggerFactory.getLogger(PayService.class);

    private final int totalNum = 100000;

    // 设置retry规则
    @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    public int minGoodsnum(int num) throws Exception {
        log.info("减库存开始:{}" , LocalTime.now());
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("illegal");
        }
        if (num <= 0) {
            throw new IllegalArgumentException("指定数量不正确");
        }
        log.info("减库存执行结束:{}" , LocalTime.now());
        return totalNum - num;
    }

}

测试类

@SpringBootTest
class PayServiceTest {

    @Autowired
    private PayService payService;

    @Test
    void minGoodsnum() throws Exception {

        int store = payService.minGoodsnum(-1);
        System.out.println("当前库存为:" + store);

    }
}

​ 运行结果说明:访问异常则会触发retry机制,超过三次则抛出异常

image-20240608223845976

​ 在Spring Boot项目中的Spring-Retry简单应用,主要是基于注解配置一些重试的策略,使用比较简单。主要的适用场景为在调用第三方接口或者使用mq时。由于会出现网络抖动,连接超时等网络异常,这时就需要重试。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3