Sobes.tech
Senior

Qanday qilib parallel HTTP chaqiruvlarini amalga oshirish mumkin? So'rov keladi, har bir vazifa uchun xizmatni parallel tarzda chaqirish, barcha javoblarni kutish va natijani qaytarish kerak.

sobes.tech AI

AIdan javob

Для реализации параллельных 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);
    }
}

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