背景
调用外部系统或者调用一些方法失败的时候,我们需要有个重试机制,保证代码的健壮性。如果直接用while和变量重试,比较繁琐
使用while实现重试,比较繁琐
java">public class RetryExample {public static void main(String[] args) {int maxRetries = 3; // 最大重试次数int retryCount = 0;boolean success = false;while (retryCount < maxRetries && !success) {try {// 调用外部接口success = callExternalApi();if (success) {System.out.println("调用成功!");} else {System.out.println("调用失败,准备重试...");}} catch (Exception e) {System.out.println("调用异常: " + e.getMessage());} finally {retryCount++;}}if (!success) {System.out.println("重试次数用尽,调用失败!");}}private static boolean callExternalApi() throws Exception {// 模拟调用外部接口double random = Math.random();if (random > 0.5) {return true; // 模拟成功} else {throw new Exception("接口调用失败"); // 模拟失败}}
}
使用Spring Retry实现重试
如果你的项目是基于 Spring 的,可以使用 Spring Retry 库来实现重试机制。
添加依赖
在 pom.xml
中添加 Spring Retry 依赖:
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.20</version>
</dependency>
启用重试机制
在 Spring Boot 启动类上添加 @EnableRetry
注解:
java">@SpringBootApplication
@EnableRetry
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
使用 @Retryable
注解
在需要重试的方法上添加 @Retryable
注解:
java">import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class ExternalApiService {@Retryable(value = {Exception.class}, // 重试的异常类型maxAttempts = 3, // 最大重试次数backoff = @Backoff(delay = 1000) // 重试间隔时间(毫秒))public boolean callExternalApi() throws Exception {// 模拟调用外部接口double random = Math.random();if (random > 0.5) {return true; // 模拟成功} else {throw new Exception("接口调用失败"); // 模拟失败}}
}
调用服务
在需要的地方注入 ExternalApiService
并调用:
java">@Autowired
private ExternalApiService externalApiService;public void doSomething() {try {boolean result = externalApiService.callExternalApi();System.out.println("调用结果: " + result);} catch (Exception e) {System.out.println("重试次数用尽,调用失败: " + e.getMessage());}
}