Spring-重试机制
...大约 2 分钟
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机制,超过三次则抛出异常
在Spring Boot项目中的Spring-Retry简单应用,主要是基于注解配置一些重试的策略,使用比较简单。主要的适用场景为在调用第三方接口或者使用mq时。由于会出现网络抖动,连接超时等网络异常,这时就需要重试。
Powered by Waline v3.1.3