Я параллельно выполняю несколько вызовов API, используя completableFuture. Я использую RetryTemplate для вызова API, когда вызовы API терпят неудачу с 500, тогда он должен повторить попытку. Если несколько вызовов API завершаются неудачей, я хочу, чтобы повторная попытка произошла для всех вызовов, которые не увенчались успехом. Я вижу, что повторяется только один вызов API, тогда как другие вызовы не повторяются
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class ApiCaller {
@Autowired
private RetryTemplate retryTemplate;
// Method to call your API using RetryTemplate
public String callApiWithRetry(String apiUrl) {
return retryTemplate.execute(context -> {
System.out.println("Attempt: " + (context.getRetryCount() + 1));
return makeApiCall(apiUrl);
});
}
// Simulated API call method
private String makeApiCall(String apiUrl) {
// Simulate an API call (replace with actual implementation)
// For demonstration purposes, throw an exception to simulate a failure
throw new RuntimeException("Simulated API failure for " + apiUrl);
}
// Method to execute API calls asynchronously
public void executeApiCalls() {
CompletableFuture call1 = CompletableFuture.supplyAsync(() -> callApiWithRetry("http://api.example.com/endpoint1"));
CompletableFuture call2 = CompletableFuture.supplyAsync(() -> callApiWithRetry("http://api.example.com/endpoint2"));
// Combine results
CompletableFuture combinedFuture = CompletableFuture.allOf(call1, call2);
// Handle results after both calls complete
combinedFuture.thenRun(() -> {
try {
String result1 = call1.get();
String result2 = call2.get();
System.out.println("Result from call 1: " + result1);
System.out.println("Result from call 2: " + result2);
} catch (Exception e) {
e.printStackTrace();
}
});
// Wait for completion
combinedFuture.join();
}
}
В приведенном выше фрагменте и вызов 1, и вызов 2 завершаются неудачно, но я вижу, что только один из вызовов API повторяет попытку. Я ожидаю повторной попытки обоих вызовов.
Повторить конфигурацию шаблона:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import
org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.web.client.HttpServerErrorException;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RetryConfig {
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
// Retry only for 500 errors (HttpServerErrorException)
Map
Подробнее здесь: https://stackoverflow.com/questions/790 ... -api-calls
Повторите попытку для нескольких параллельных вызовов API. ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1727226568
Anonymous
Я параллельно выполняю несколько вызовов API, используя completableFuture. Я использую RetryTemplate для вызова API, когда вызовы API терпят неудачу с 500, тогда он должен повторить попытку. Если несколько вызовов API завершаются неудачей, я хочу, чтобы повторная попытка произошла для всех вызовов, которые не увенчались успехом. Я вижу, что повторяется только один вызов API, тогда как другие вызовы не повторяются
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class ApiCaller {
@Autowired
private RetryTemplate retryTemplate;
// Method to call your API using RetryTemplate
public String callApiWithRetry(String apiUrl) {
return retryTemplate.execute(context -> {
System.out.println("Attempt: " + (context.getRetryCount() + 1));
return makeApiCall(apiUrl);
});
}
// Simulated API call method
private String makeApiCall(String apiUrl) {
// Simulate an API call (replace with actual implementation)
// For demonstration purposes, throw an exception to simulate a failure
throw new RuntimeException("Simulated API failure for " + apiUrl);
}
// Method to execute API calls asynchronously
public void executeApiCalls() {
CompletableFuture call1 = CompletableFuture.supplyAsync(() -> callApiWithRetry("http://api.example.com/endpoint1"));
CompletableFuture call2 = CompletableFuture.supplyAsync(() -> callApiWithRetry("http://api.example.com/endpoint2"));
// Combine results
CompletableFuture combinedFuture = CompletableFuture.allOf(call1, call2);
// Handle results after both calls complete
combinedFuture.thenRun(() -> {
try {
String result1 = call1.get();
String result2 = call2.get();
System.out.println("Result from call 1: " + result1);
System.out.println("Result from call 2: " + result2);
} catch (Exception e) {
e.printStackTrace();
}
});
// Wait for completion
combinedFuture.join();
}
}
В приведенном выше фрагменте и вызов 1, и вызов 2 завершаются неудачно, но я вижу, что только один из вызовов API повторяет попытку. Я ожидаю повторной попытки обоих вызовов.
[b]Повторить конфигурацию шаблона:[/b]
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import
org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.web.client.HttpServerErrorException;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RetryConfig {
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
// Retry only for 500 errors (HttpServerErrorException)
Map
Подробнее здесь: [url]https://stackoverflow.com/questions/79019561/retry-for-multiple-parallel-api-calls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия