5.1 sendAsync() metódus

A HttpClient használatával aszinkron kéréseket is küldhet. Általában ez három esetben történik.

Az első eset az, hogy a kérés nagyon sokáig tart , például egy fájl küldése/fogadása. Ez a művelet ezután elindul és aszinkron módon végrehajtódik.

A második eset az, hogy nagyon gyakran kell kéréseket küldenie , és nem akarja megvárni az előző kérés válaszát, mielőtt elküldi a következőt.

És végül, a harmadik eset - a kérésének eredménye nem fontos az Ön számára . Például percenként egyszer készít egy képernyőképet a képernyőről, és elküldi a szervernek. Vagyis az alkalmazás logikája azt feltételezi, hogy sok kérés van, és nem mindegyik éri el őket. Akkor kényelmes az elv szerint dolgozni - küldje el és felejtse el.

Aszinkron kérés küldéséhez meg kell hívnia egy metódust sendAsync()a HttpClient osztály egyik objektumán. Ez a metódus azonnal kilép, és egy CompletableFuture<HttpResponse>. Ezzel nyomon követheti, hogy a kérés ténylegesen mikor hajtódik végre, valamint végrehajthat bizonyos kódot a kérés teljesítése után. Példa:

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

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

A metódus sendAsync()egy HttpResponse-t tartalmazó objektumot ad vissza CompletableFuture, amely tartalmazza a kiszolgáló által visszaadott karakterláncot.

5.2 Az executor() metódus, ExecutorService

Ezenkívül a HttpClient lehetővé teszi, hogy átadjon neki ExecutorService(szálkészletnek), amelyet aszinkron kérések végrehajtására használnak. Valójában a szerveroldali Java alkalmazásokban ez mindig megtörténik.

Végül is, ha az API-jába érkező minden egyes kérésnél több aszinkron kérést indít el valahol máshol, akkor nem lesz elég szál. Példa:

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());

Ha a szálkészlet nincs beállítva, akkor az alapértelmezett érték .java.util.concurrent.Executors.newCachedThreadPool()