5.1 sendAsync() yöntemi

HttpClient'i kullanarak eşzamansız istekler de gönderebilirsiniz. Genellikle bu üç durumda yapılır.

İlk durum, talebin çok uzun süreceği , örneğin bir dosyanın gönderilmesi / alınmasıdır. Bu işlem daha sonra başlatılır ve eşzamansız olarak yürütülür.

İkinci durumda, çok sık istek göndermeniz gerekir ve bir sonraki isteği göndermeden önce önceki istekten yanıt beklemek istemezsiniz.

Ve son olarak, üçüncü durum - talebinizin sonucu sizin için önemli değil . Örneğin dakikada bir ekranınızın ekran görüntüsünü alıp sunucuya gönderiyorsunuz. Yani, uygulamanızın mantığı, çok sayıda istek olduğunu ve hepsinin onlara ulaşmadığını varsayar. O zaman ilkeye göre çalışmak uygundur - gönder ve unut.

Eşzamansız bir istek göndermek için, sendAsync()HttpClient sınıfının bir nesnesi üzerinde bir yöntem çağırmanız gerekir. Bu yöntem hemen çıkar ve bir CompletableFuture<HttpResponse>. Bununla birlikte, isteğin ne zaman gerçekten yürütüldüğünü izleyebilir ve istek tamamlandıktan sonra belirli bir kodu yürütebilirsiniz. Örnek:

HttpClient client = HttpClient.newBuilder().build();

CompletableFuture<HttpResponse<String>> response = client.sendAsync(
        request,
        HttpResponse.BodyHandlers.ofString()
);

Yöntem, içinde sunucunun döndüreceği dizeyi içeren bir HttpResponse içeren sendAsync()bir nesne döndürür .CompletableFuture

5.2 executor() yöntemi, ExecutorService

ExecutorServiceAyrıca, HttpClient , eşzamansız istekleri gerçekleştirmek için kullanılacak olan ona (bir iş parçacığı havuzu) geçmenize izin verir . Aslında, sunucu taraflı Java uygulamalarında bu her zaman yapılır.

Sonuçta, API'nize gelen her istek için başka bir yerde birkaç eşzamansız istek başlatırsanız, yeterli iş parçacığınız olmaz. Örnek:

ExecutorService executorService = Executors.newFixedThreadPool(2);

CompletableFuture<HttpResponse<String>> response1 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

CompletableFuture<HttpResponse<String>> response2 = HttpClient.newBuilder()
  .executor(executorService)
  .build()
  .sendAsync(request, HttpResponse.BodyHandlers.ofString());

İş parçacığı havuzu ayarlanmamışsa varsayılan değer .java.util.concurrent.Executors.newCachedThreadPool()