Senior
Параллелдүү HTTP чакырууларды кантип ишке ашыруу керек? Суроо келип, ар бир тапшырма үчүн кызматты параллелдүү чакырыш керек, бардык жоопторду күтүп, натыйжаны кайтаруу керек.
sobes.tech AI
AIден жооп
Для реализации параллельных 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);
}
}
Таким образом, запросы выполняются параллельно, и мы ждем их завершения, прежде чем возвращать результат.