Sobes.tech
Back to questions
Senior
5

Нужно написать функцию генерации отчёта, которая делает 4 независимых REST-запроса параллельно и собирает результаты. Как решить?

Companies where asked
ТБанк

Answer from AI

sobes.tech AI

Для параллельного выполнения 4 независимых REST-запросов и сбора результатов в Java можно использовать CompletableFuture. Это позволяет запускать запросы асинхронно и дождаться их завершения, собрав все ответы.

Пример:

import java.net.http.*;
import java.net.URI;
import java.util.concurrent.*;
import java.util.*;

public class ReportGenerator {
    private static final HttpClient client = HttpClient.newHttpClient();

    public static List<String> generateReport() throws Exception {
        List<String> urls = List.of(
            "https://api.example.com/data1",
            "https://api.example.com/data2",
            "https://api.example.com/data3",
            "https://api.example.com/data4"
        );

        List<CompletableFuture<String>> futures = new ArrayList<>();

        for (String url : urls) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .GET()
                .build();

            CompletableFuture<String> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body);

            futures.add(future);
        }

        // Ждем завершения всех запросов и собираем результаты
        CompletableFuture<Void> allDone = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        allDone.join();

        List<String> results = new ArrayList<>();
        for (CompletableFuture<String> future : futures) {
            results.add(future.get());
        }

        return results;
    }
}

Такой подход эффективен, так как запросы выполняются параллельно, и время ожидания сокращается до максимального времени одного из запросов.