SpringBoot整合Retry(重试机制)
欢迎来到北京杰子技术站
当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可 以与Hystaix结合使用,可以避免访问到已经不正常的实例。后面的直接上demo
首先加入依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
在启动类上加@EnableRetry注解,表示启动重试机制
@EnableRetry //开启retry机制
@SpringBootApplication
public class SprongBootRetryApplication {
public static void main(String[] args) {
SpringApplication.run(SprongBootRetryApplication.class, args);
}
}
定义一个简单的controller层
@RestController
public class TestRetryController {
@Autowired
private TestRetryService testRetryService;
@GetMapping("test")
public String test(@RequestParam("num") Integer num) {
try {
int count = testRetryService.testRetry(num);
if (count>0) {
return "修改成功";
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "修改失败";
}
return "修改失败";
}
}
定义一个简单的Service层
@Service
public class TestRetryServiceImpl implements TestRetryService {
private Logger logger = LoggerFactory.getLogger(getClass());
private final int totalNum = 100000;
@Retryable(value=Exception.class,maxAttempts=3,backoff=@Backoff(delay=2000,multiplier=1.5))
@Override
public int testRetry(Integer num) throws Exception {
logger.info("minGoodsnum开始" + LocalTime.now());
if (num <= 0) {
throw new Exception("数量不对");
}
logger.info("minGoodsnum执行结束");
return totalNum - num;
}
}
在testRetry方法上加上@Retryable注解,value值表示当哪些异常的时候触发重试,maxAttempts表示最大重试次数默认为3,delay表示重试的延迟时间,multiplier表示上一次延时时间是这一次的倍数。
测试:
结果:
当出现Exception时会重复调用3次重复调用的是service层不是Controller层
好了,本次记录就到这儿了。我想这篇博客如果你认真的看完,肯定会有收获的!最后如果文中有任何错误或欠妥的地方,还望指正。欢迎留言交流!