जैसा कि मुझे पता है, स्प्रिंग RestTemplate सिंक्रोनस है और वेब क्लाइंट को प्रतिक्रिया मिलने तक थ्रेड को ब्लॉक करता है, और स्प्रिंग WebClient एसिंक्रोनस और नॉन-ब्लॉकिंग है।

लेकिन क्या होगा यदि हम किसी @Async एनोटेट विधि के भीतर RestTemplate का उपयोग करके API को कॉल करें?

क्या यह @Async द्वारा बनाए गए नए थ्रेड को ब्लॉक करता है?

अंत में, बाकी एपीआई के एसिंक कॉल के लिए आपका क्या सुझाव है (बिना WebClient क्योंकि मैं 5 से पुराने स्प्रिंग संस्करण का उपयोग कर रहा हूं)। धन्यवाद

2
Mohammad Hosein Talaee 10 जिंदा 2021, 20:17

1 उत्तर

सबसे बढ़िया उत्तर

क्या होगा अगर हम एक @Async एनोटेट विधि के भीतर RestTemplate का उपयोग करके एक एपीआई कहते हैं?

विधि आपके द्वारा @Async एनोटेशन पैरामीटर में निर्दिष्ट निष्पादक पर अतुल्यकालिक रूप से चलेगी। जैसे @Async("threadPool") जहां "थ्रेडपूल" एक्ज़ीक्यूटर बीन का नाम है।

क्या यह @Async द्वारा बनाए गए नए थ्रेड को ब्लॉक करता है?

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

बाकी एपीआई के एसिंक कॉल के लिए आपका क्या सुझाव है (वेब ​​क्लाइंट के बिना क्योंकि मैं 5 से पुराने स्प्रिंग संस्करण का उपयोग कर रहा हूं)?

यदि आपको केवल "async" प्रभाव की आवश्यकता है, तो आप CompletableFuture API या @Async का उपयोग कर सकते हैं। लेकिन अगर आपको "गैर-अवरुद्ध" संपत्ति की भी आवश्यकता है, तो आपको कुछ गैर-अवरुद्ध HTTP क्लाइंट का उपयोग करने की आवश्यकता है, उदाहरण के लिए, ओकेhttp.

Okhttp के साथ गैर-अवरुद्ध async HTTP कॉल इस प्रकार दिखाई देगा:

public CompletableFuture<Response> call() {
  Request request = new Request.Builder()
    .url(URL)
    .build();
  Call call = client.newCall(request);
  CompletableFuture<Response> result = new CompletableFuture<>();
  call.enqueue(new Callback() {
    public void onResponse(Call call, Response response) throws IOException {
      result.complete(response);
    }
    public void onFailure(Call call, IOException e) {
      result.completeExceptionally(e);
    }
  });
  return result;
}
1
Ilya Zinkovich 11 जिंदा 2021, 23:43
1
आपके सहायक उत्तर के लिए बहुत-बहुत धन्यवाद
 – 
Mohammad Hosein Talaee
12 जिंदा 2021, 13:08