配置
pom.xml配置
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
启动类增加注解@EnableRetry
retry测试类
@Service @Slf4j public class RetryService { @Retryable(value = {Exception.class}, maxAttempts = 3, backoff = @Backoff(value = 1000L)) public JSONObject getResult(HttpServletRequest request) { log.info("start getResult"); throw new RuntimeException("getResult error"); } @Recover private JSONObject recover(Exception e) { log.error("recover error, e.getmessage:{}, e:{}", e.getMessage(), e); JSONObject jsonObject = new JSONObject(); jsonObject.put("data", 123); return jsonObject; } }
执行结果
2017-12-08 12:00:40.096 INFO 13945 --- [nio-8080-exec-1] c.i.learn.aspect.service.RetryService : start getResult 2017-12-08 12:00:41.101 INFO 13945 --- [nio-8080-exec-1] c.i.learn.aspect.service.RetryService : start getResult 2017-12-08 12:00:42.105 INFO 13945 --- [nio-8080-exec-1] c.i.learn.aspect.service.RetryService : start getResult 2017-12-08 12:00:42.114 ERROR 13945 --- [nio-8080-exec-1] c.i.learn.aspect.service.RetryService : recover error, e.getmessage:getResult error, e:{} java.lang.RuntimeException: getResult error
会首先重试3此retry注解中的内容,三次都失败之后会执行recover,然后抛出异常。
@Retryable(value={A异常.class,B异常.class}, maxAttempts=重试次数, backoff = @Backoff(value = 每次重试延迟毫秒数)) public Integer retry() { LOGGER.info("测试retry"); final int a = 5; int num = new SecureRandom().nextInt(); if (num % a == 0) { return num; } throw new RetryException("重试失败"); }