5.1 sendAsync() पद्धत

तुम्ही HttpClient वापरून असिंक्रोनस विनंत्या देखील पाठवू शकता. हे सहसा तीन प्रकरणांमध्ये केले जाते.

पहिली केस अशी आहे की विनंतीला खूप वेळ लागेल , उदाहरणार्थ, फाइल पाठवणे / प्राप्त करणे. हे ऑपरेशन नंतर सुरू केले जाते आणि असिंक्रोनसपणे कार्यान्वित केले जाते.

दुसरी केस अशी आहे की तुम्हाला वारंवार विनंत्या पाठवाव्या लागतील आणि पुढची विनंती पाठवण्यापूर्वी तुम्ही मागील विनंतीच्या प्रतिसादाची प्रतीक्षा करू इच्छित नाही.

आणि शेवटी, तिसरा केस - तुमच्या विनंतीचा परिणाम तुमच्यासाठी महत्त्वाचा नाही . उदाहरणार्थ, तुम्ही मिनिटातून एकदा तुमच्या स्क्रीनचा स्क्रीनशॉट घ्या आणि तो सर्व्हरला पाठवता. म्हणजेच, तुमच्या अर्जाचा तर्क असे गृहीत धरतो की अनेक विनंत्या आहेत आणि त्या सर्व पोहोचत नाहीत. मग तत्त्वानुसार कार्य करणे सोयीचे आहे - पाठवा आणि विसरा.

असिंक्रोनस विनंती पाठवण्यासाठी, तुम्हाला sendAsync()HttpClient क्लासच्या ऑब्जेक्टवर पद्धत कॉल करणे आवश्यक आहे. ही पद्धत त्वरित बाहेर पडते आणि a परत करते 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()