अवरुद्ध करना बुरा है, क्योंकि यह प्रतिक्रिया की प्रतीक्षा कर रहे धागे को बांधता है। यह बहुत है एक प्रतिक्रियाशील ढांचे में खराब जिसके निपटान में कुछ धागे हैं, और इसे इस तरह से डिज़ाइन किया गया है कि कोई नहीं उनमें से अनावश्यक रूप से अवरुद्ध किया जाना चाहिए।
यही वह चीज है जिससे बचने के लिए प्रतिक्रियाशील ढांचे को डिज़ाइन किया गया है, इसलिए इस मामले में यह आपको ऐसा करने से रोकता है:
इसके विपरीत, आपका नया कोड अतुल्यकालिक रूप से काम करता है। धागा अवरुद्ध नहीं है, क्योंकि वास्तव में कुछ भी नहीं होता है जब तक कि भंडार एक मूल्य नहीं देता (और फिर लैम्ब्डा जिसे आपने savedQuote.subscribe()
पर पास किया है। निष्पादित किया जाता है, आपके परिणाम को कंसोल पर प्रिंट करता है।)
हालांकि, प्रतिक्रियाशील धाराओं के नजरिए से नया कोड अभी भी इष्टतम/सामान्य नहीं है, क्योंकि आप अपनी सदस्यता पद्धति में अपने सभी तर्क कर रहे हैं। सामान्य बात यह है कि हमारे लिए स्ट्रीम में आइटम को बदलने के लिए फ्लैटमैप/मैप कॉल की एक श्रृंखला है, और doOnNext()
का उपयोग करें। साइड इफेक्ट के लिए (जैसे किसी मान को प्रिंट करना):
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
यदि आप रिएक्टर/प्रतिक्रियाशील धाराओं के साथ कोई गंभीर काम कर रहे हैं, तो सामान्य रूप से उन पर पढ़ना उचित होगा। वे गैर-अवरुद्ध कार्य के लिए बहुत शक्तिशाली हैं, लेकिन उन्हें अधिक "मानक" जावा की तुलना में सोचने के एक अलग तरीके (और कोडिंग) की आवश्यकता होती है।