5.1 सेंडएसिंक () विधि

आप HttpClient का उपयोग करके अतुल्यकालिक अनुरोध भी भेज सकते हैं। आमतौर पर यह तीन मामलों में किया जाता है।

पहला मामला यह है कि अनुरोध में बहुत लंबा समय लगेगा , उदाहरण के लिए, फ़ाइल भेजना/प्राप्त करना। यह ऑपरेशन तब एसिंक्रोनस रूप से शुरू और निष्पादित किया जाता है।

दूसरा मामला यह है कि आपको बहुत बार अनुरोध भेजने की आवश्यकता होती है और आप अगले अनुरोध को भेजने से पहले पिछले अनुरोध की प्रतिक्रिया की प्रतीक्षा नहीं करना चाहते हैं।

और अंत में, तीसरा मामला - आपके अनुरोध का परिणाम आपके लिए महत्वपूर्ण नहीं है । उदाहरण के लिए, आप एक मिनट में एक बार अपनी स्क्रीन का स्क्रीनशॉट लेते हैं और इसे सर्वर पर भेजते हैं। यानी, आपके आवेदन का तर्क मानता है कि कई अनुरोध हैं और सभी उन तक नहीं पहुंचते हैं। फिर सिद्धांत के अनुसार काम करना सुविधाजनक है - भेजें और भूल जाएं।

अतुल्यकालिक अनुरोध भेजने के लिए, आपको sendAsync()HttpClient वर्ग के किसी ऑब्जेक्ट पर एक विधि कॉल करने की आवश्यकता है। यह विधि तुरंत बाहर निकलती है और एक वापस आती है CompletableFuture<HttpResponse>। इसके साथ, आप ट्रैक कर सकते हैं कि वास्तव में अनुरोध कब निष्पादित किया गया है, साथ ही अनुरोध पूरा होने के बाद कुछ कोड निष्पादित करें। उदाहरण:


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

विधि sendAsync()एक ऑब्जेक्ट लौटाती है CompletableFutureजिसमें एक HttpResponse होता है, जिसमें वह स्ट्रिंग होती है जो सर्वर वापस करेगा।

5.2 निष्पादक () विधि, निष्पादक सेवा

साथ ही, एचटीपी क्लाइंट आपको इसे ExecutorService(धागे का पूल) पास करने की अनुमति देता है जिसका उपयोग एसिंक्रोनस अनुरोधों को करने के लिए किया जाएगा। दरअसल, सर्वर-साइड जावा एप्लिकेशन में, यह हमेशा किया जाता है।

आखिरकार, यदि आपके एपीआई में आने वाले प्रत्येक अनुरोध के लिए, आप कई अतुल्यकालिक अनुरोधों को कहीं और लॉन्च करेंगे, तो आपके पास पर्याप्त थ्रेड नहीं होंगे। उदाहरण:


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