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);
}
}
Таким образом, запросы выполняются параллельно, и мы ждем их завершения, прежде чем возвращать результат.