我有一个spring-boot应用程序,该应用程序需要调用外部API。 如果有“ n”个外部呼叫,则将创建“ n”个以后的任务,并进行其余呼叫。这里的问题是,如果任何剩余呼叫都失败,但异常,我需要重试该呼叫3次。 我试过使用Spring-try,但不会尝试失败。
以下是到目前为止我重试过的代码片段。 当任何正在调用的服务关闭并且程序不重试或进入恢复块时,我立即收到IO异常。 是因为没有为新线程创建代理。
@SpringBootApplication
@EnableRetry
public class SpringBootWebApplication implements CommandLineRunner{
@Autowired
RestClient client;
public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
String a[] = new String[] {args[0],args[1],args[2] };
// getting the list view of Array
List<String> list = Arrays.asList(a);
client.executeRest(list)
}
}
######
I have another class where future tasks will be created.
public class RestClient(){
public void executeRest(List<String> uris)){
ExecutorService executor = Executors.newFixedThreadPool(2);
for(String uri : uris){
Future<String> t = executor.execute(new MyCallable(uri));
}
}
}
public class MyCallable implements Callable<String> {
private String endPoint;
public MyCallable(String endPoint){
this.endPoint=endPoint;
}
@Override
public void call() throws Exception {
system.out.println(makeRestGetCall(String uri));
}
@Retryable(
value = { Excelption.class },
maxAttempts = 2,
backoff = @Backoff(delay = 5000))
public String makeRestGetCall(String uri){
return restTemplate.exchange(uri, HttpMethod.GET,String.class);
}
@Recover
void recover(Exception e){
system.out.println("Max retries done")
}
}
答案 0 :(得分:0)
仅当该方法抛出在值中配置的异常(在您的情况下为Exception
)时尝试重试, restTemplate.exchange 方法抛出多个Exceptions
,因此尝试使用自定义Exception
public class CustomException extends RuntimeException {
}
重试方法
@Retryable(
value = { CustomException.class },
maxAttempts = 2,
backoff = @Backoff(delay = 5000))
public String makeRestGetCall(String uri){
try {
return restTemplate.exchange(uri, HttpMethod.GET,String.class);
}catch(Exception ex) {
// do something or log something
throw new CustomException();
}
}