JavaRush /Kurslar /All lectures for UZ purposes /HttpClient’да Асинхрон сўровлар

HttpClient’да Асинхрон сўровлар

All lectures for UZ purposes
Daraja, Dars
Mavjud

5.1 sendAsync() Методи

HttpClient орқали асинхрон сўровларни ҳам юбориш мумкин. Бу одатда учта ҳолатда бажарилади.

Биринчи ҳолат – бу сўров жуда узоқ вақт амалга оширилади, масалан, файл юбориш/қабул қилиш. Қачонки, бундай операцияни асинхрон тарзда ишга туширишади ва бажаришади.

Иккинчи ҳолат – сенга жуда тез-тез сўров юбориш керак бўлганда, ва хара бир сўровга жавоб кутмасдан кейинги сўровни юборишни хоҳламаслик.

Ва ниҳоят, учинчи ҳолат – сенга сўров натижаси муҳим эмас. Масалан, сен ҳар дақиқада ўз экранингни скриншотини олиб, уни серверга юборишинг мумкин. Демак, сенинг дастурингнинг мантиғи шундаки, кўплаб сўровлар юборилади ва ҳаммаси манзилга етмайди. Бу ерда принцип бўйича ишлаш қулай – юбординг ва унутдинг.

Асинхрон сўров юбориш учун, HttpClient объектининг sendAsync() методини чақириш керак. Бу метод бир зумда ишни тугатади ва CompletableFuture<HttpResponse> объектни қайтаради. Унинг ёрдамида сўров реал бажарилганда кузатиш мумкин, шунингдек, сўров тугатишидан кейин муайян кодни бажариш мумкин. Намуна:


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

Метод sendAsync() CompletableFuture объектни қайтаради, бу объект ичида HttpResponse, у ичида эса сервер қайтарган строка мавжуд.

5.2 executor() Методи, ExecutorService

HttpClient шунингдек, унга ExecutorService (потокларнинг пуллари)ни юбориш имконини ҳам беради, улар асинхрон сўровларни амалга ошириш учун фойдаланилади. Аслида, сервер томонлама Java-дастурларда шундай қилинади.

Агар сенинг API’нгга ҳар бир кирувчи сўров учун, яна бир нечта асинхрон сўровларни бошқа жойга юборишни бошласанг, сенга етарсиз потоклар бўлмайди. Намуна:


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

Агар потоклари пули белгиланмаган бўлса, унда стандарт бўйича java.util.concurrent.Executors.newCachedThreadPool() фойдаланилади.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION