У меня есть приложение с начальной загрузкой, которое должно вызывать внешние API.
Если есть «n» внешних вызовов, будут созданы «n» будущие задачи и будут сделаны остальные вызовы. Проблема здесь заключается в том, что если какой-либо из остальных вызовов завершится неудачно, я должен повторить вызов 3 раза.
Я пытался использовать Spring-retry, но он не повторяется при ошибке.
Ниже приведен фрагмент кода, который я до сих пор пытался повторить.
Я сразу же получаю исключение ввода-вывода, когда какая-либо вызываемая служба не работает, и программа не повторяет попытки или не входит в блок восстановления.
Это потому что прокси не создаются для новых тем.
@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")
}
}