Springboot + Retryable

该博客介绍了如何在Spring Boot应用中使用@Retryable注解实现异常重试机制。通过配置maxAttempts、backoff参数来设置重试次数和延迟时间,并通过@Recover注解定义重试失败后的处理方法。示例展示了当方法执行异常时,系统自动进行重试,直到达到最大重试次数,然后执行恢复方法。
摘要由CSDN通过智能技术生成

1. pom.xml

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

        <dependency>
            <groupId>org.aspectj</groupId >
            <artifactId>aspectjweaver</artifactId >
            <version>1.6.11</version >
        </dependency>

2. 启动类Application

添加 @EnableRetry 注解

@SpringBootApplication
@EnableRetry
public class DemoApplication {

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

}

3. Service

public interface MyService {

    public String retryTest(int code) throws Exception;

}

4. ServiceImpl

@Service
@Slf4j
public class MyServiceImpl implements MyService {

    @Override
    @Retryable(value=Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 2))
    public String retryTest(int code) throws Exception {
        log.info("{} :running",LocalTime.now());
        if(code < 5){
            log.error("{} :retry {}",LocalTime.now(),code);
            throw new Exception("running exception !!");
        }
        return "success";
    }

	/**
	 * 重试次数耗尽后的处理
	 * 可以记日志或者其他弥补措施
	 */
    @Recover
    public String retryTestRecover(Exception e,int code){
        log.error("done: error !!");
        return "error";
    }
}

@Retryable 和 @Transactional 注解比较类似;

  • value: 触发重试的异常条件
  • maxAttempts: 最大重试次数
  • backoff :重试机制(delay :延时多久重试,multiplier :每次重试延时时间翻倍数)

@Recover 注解的重试次数耗尽方法返回值与参数中的异常类需要与@Retryable的返回值与抛出的异常类一致!!

5. Controller

@RestController
@RequestMapping("/test")
public class MyController {

    @Autowired
    MyService myService;

    @GetMapping("retry")
    public String testRetry() throws Exception{
        return myService.retryTest(1);
    }
}

6. 验证

启动程序,访问 http://localhost:8080/test/retry

2021-12-10 08:52:39.038  INFO 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:39.038 :running
2021-12-10 08:52:39.039 ERROR 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:39.039 :retry 1
2021-12-10 08:52:41.044  INFO 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:41.044 :running
2021-12-10 08:52:41.046 ERROR 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:41.046 :retry 1
2021-12-10 08:52:45.048  INFO 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:45.048 :running
2021-12-10 08:52:45.050 ERROR 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : 08:52:45.050 :retry 1
2021-12-10 08:52:45.052 ERROR 20312 --- [nio-8000-exec-1] c.e.demo.service.impl.MyServiceImpl      : done: error !!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值