Повторите попытку для нескольких параллельных вызовов API.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Повторите попытку для нескольких параллельных вызовов API.

Сообщение 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 повторяет попытку. Я ожидаю повторной попытки обоих вызовов.
Повторить конфигурацию шаблона:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»