Sobes.tech
Senior

Paralel HTTP çağrılarını nasıl gerçekleştirirsiniz? Bir istek gelir, her görev için hizmeti paralel çağırmanız, tüm yanıtları beklemeniz ve sonucu döndürmeniz gerekir.

sobes.tech yapay zeka

AI'dan gelen yanıt

Для реализации параллельных HTTP-вызовов в Java можно использовать CompletableFuture из пакета java.util.concurrent. Идея в том, чтобы для каждой задачи запустить асинхронный HTTP-запрос, дождаться завершения всех с помощью CompletableFuture.allOf(), а затем собрать результаты.

Пример с использованием HttpClient из Java 11+:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

public class ParallelHttpCalls {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        List<String> urls = List.of(
            "https://service1/api/task",
            "https://service2/api/task",
            "https://service3/api/task"
        );

        List<CompletableFuture<HttpResponse<String>>> futures = urls.stream()
            .map(url -> {
                HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .GET()
                    .build();
                return client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
            })
            .collect(Collectors.toList());

        CompletableFuture<Void> allDone = CompletableFuture.allOf(
            futures.toArray(new CompletableFuture[0])
        );

        CompletableFuture<List<String>> allResponses = allDone.thenApply(v -> 
            futures.stream()
                .map(CompletableFuture::join)
                .map(HttpResponse::body)
                .collect(Collectors.toList())
        );

        List<String> results = allResponses.get();
        results.forEach(System.out::println);
    }
}

Таким образом, запросы выполняются параллельно, и мы ждем их завершения, прежде чем возвращать результат.