Bootstrap

Spring Retry教程(2)-注解方式的实现

1. 在pom.xml中添加依赖

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

2. 在@Configuration类或者启动类中添加注释@EnableRetry

@Configuration
@EnableRetry
public class AppConfig { ... }

@SpringBootApplication
@EnableRetry
public class Application

3. 在需要重试的方法上添加注解@Retryable,@Recover来开启重试失败后调用的方法

3.1 @Retryable 作用于需要进行重试的方法

  • value:指定处理的异常类,默认为空
  • include:指定处理的异常类,默认为空,当include和exclude为空时,默认所有异常
  • exclude:指定哪些异常不处理,默认空
  • maxAttempts:最大重试次数。默认3次

3.2 @Backoff 作用于backoff中的补偿策略

补偿策略处理的是两次重试之间的时间间隔问题。

  • delay:指定等待时间,没有设置的话默认为1000ms
  • maxDelay:最大重试时间,没有设置默认为3000ms
  • multiplier:下一次调用时间的乘数
  • random:随机等待时间,默认值为false
@Service
public class SpringRetryService{
    private static final Logger LOGGER = LoggerFactory.getLogger(SpringRetryService.class);

    @Retryable(value = {Exception.class},exclude={}, maxAttempts = 5, backoff =@Backoff(value = 1000,multiplier = 2))
    public void testRetry() throws Exception {
        boolean result = false;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            LOGGER.info("重试方法被调用,当前时间是" + sdf.format(new Date()));
            int i = 9 / 0;
        } catch (Exception e) {
            throw new Exception("重试之后,还是失败了!", e);
        }
    }
    @Recover
    public void testRecovery(Exception e) {
        
        LOGGER.warn("重试5次依旧失败了!"+e.getMessage());
    }
}

4. Controller中测试

@RestController
@RequestMapping("/springRetry")
public class SpringRetryController {
    private static final Logger LOG = LoggerFactory.getLogger(SpringRetryController.class);
    @Autowired
    private SpringRetryService pringRetryService;
    @RequestMapping("/testSpringRetry")
    public String testSpringRetry() {
        LOG.info("invoke method testSpringRetry! ");
        try {
            pringRetryService.testRetry();
        } catch (Exception e) {
            LOG.error("重试失败了", e);
        }
        return " retry success";
    }
}
;