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()
GO TO FULL VERSION