5.1 sendAsync() na paraan

Maaari ka ring magpadala ng mga asynchronous na kahilingan gamit ang HttpClient. Kadalasan ito ay ginagawa sa tatlong kaso.

Ang unang kaso ay ang kahilingan ay tatagal ng napakatagal , halimbawa, pagpapadala / pagtanggap ng file. Ang operasyong ito ay sinisimulan at ipapatupad nang asynchronous.

Ang pangalawang kaso ay kailangan mong magpadala ng mga kahilingan nang madalas at hindi mo gustong maghintay ng tugon mula sa nakaraang kahilingan bago ipadala ang susunod.

At panghuli, ang pangatlong kaso - ang resulta ng iyong kahilingan ay hindi mahalaga sa iyo . Halimbawa, kukuha ka ng screenshot ng iyong screen isang beses sa isang minuto at ipadala ito sa server. Ibig sabihin, ang lohika ng iyong aplikasyon ay ipinapalagay na maraming mga kahilingan at hindi lahat ay nakakaabot sa kanila. Pagkatapos ito ay maginhawa upang gumana ayon sa prinsipyo - ipadala at kalimutan.

Upang magpadala ng isang asynchronous na kahilingan, kailangan mong tumawag ng isang paraan sendAsync()sa isang bagay ng klase ng HttpClient. Ang pamamaraang ito ay lumabas kaagad at nagbabalik ng isang CompletableFuture<HttpResponse>. Gamit ito, maaari mong subaybayan kung kailan aktwal na naisakatuparan ang kahilingan, pati na rin ang pagpapatupad ng ilang code pagkatapos makumpleto ang kahilingan. Halimbawa:

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

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

Ang pamamaraan sendAsync()ay nagbabalik ng isang bagay CompletableFuturena naglalaman ng isang HttpResponse sa loob, na naglalaman ng string na ibabalik ng server.

5.2 Ang executor() method, ExecutorService

Gayundin, pinapayagan ka ng HttpClient na ipasa ito ExecutorService(isang pool ng mga thread) na gagamitin upang magsagawa ng mga asynchronous na kahilingan. Sa totoo lang, sa mga server-side na Java application, ito ay palaging ginagawa.

Pagkatapos ng lahat, kung para sa bawat papasok na kahilingan sa iyong API, maglulunsad ka ng ilang mga asynchronous na kahilingan sa ibang lugar, hindi ka magkakaroon ng sapat na mga thread. Halimbawa:

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

Kung hindi nakatakda ang thread pool, ang default ay .java.util.concurrent.Executors.newCachedThreadPool()