जावा में रिएक्टिव प्रोग्रामिंग: Project Reactor और RxJava
रिएक्टिव प्रोग्रामिंग एक डेवलपमेंट पैराडाइम है जो डेटा और इवेंट्स के एसिंक्रोनस स्ट्रीम को प्रोसेस करने पर केंद्रित है। जावा में, यह पैराडाइम Reactive Streams स्पेसिफिकेशन को लागू करने वाली लाइब्रेरीज़ के कारण व्यापक रूप से अपनाया गया है। दो सबसे लोकप्रिय इम्प्लीमेंटेशन Project Reactor (Spring WebFlux का आधार) और RxJava (Reactive Extensions for Java) हैं।
पारंपरिक इम्पेरेटिव दृष्टिकोण के विपरीत, रिएक्टिव प्रोग्रामिंग एक्ज़ीक्यूशन थ्रेड्स को ब्लॉक किए बिना बड़ी मात्रा में डेटा के साथ कुशलतापूर्वक काम करने की अनुमति देती है। यह आधुनिक हाई-लोड वेब एप्लिकेशन, माइक्रोसर्विसेज और रियल-टाइम सिस्टम के लिए विशेष रूप से महत्वपूर्ण है।
रिएक्टिव प्रोग्रामिंग की मुख्य अवधारणाएँ
रिएक्टिव दृष्टिकोण के मूल में तीन प्रमुख अवधारणाएँ हैं:
- Observable (प्रकाशक) — डेटा का स्रोत जो इवेंट्स (एलिमेंट, एरर, समाप्ति) उत्पन्न कर सकता है।
- Observer (सब्सक्राइबर) — डेटा का उपभोक्ता जो इवेंट्स पर प्रतिक्रिया करता है।
- ऑपरेटर — स्ट्रीम ट्रांसफॉर्मेशन फंक्शन (map, filter, flatMap, combineLatest, आदि)।
रिएक्टिव स्ट्रीम backpressure (बैक प्रेशर) के सिद्धांत का पालन करती हैं: सब्सक्राइबर प्रकाशक को बता सकता है कि वह कितने एलिमेंट प्रोसेस करने के लिए तैयार है, जिससे मेमोरी ओवरफ्लो को रोका जा सकता है।
Project Reactor: Flux और Mono
Project Reactor Pivotal (अब VMware) की एक रिएक्टिव लाइब्रेरी है, जो Spring WebFlux का आधार है। यह दो मुख्य प्रकार प्रदान करती है:
- Flux<T> — एक स्ट्रीम जिसमें 0, 1 या कई एलिमेंट हो सकते हैं (एसिंक्रोनस अनुक्रम)।
- Mono<T> — एक स्ट्रीम जिसमें 0 या 1 एलिमेंट होता है (Optional के समान, लेकिन एसिंक्रोनस)।
उदाहरण: Flux बनाना और प्रोसेस करना
import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;
public class ReactorExample { public static void main(String[] args) { // सूची से एक स्ट्रीम बनाएं Flux<String> names = Flux.just("Alice", "Bob", "Charlie", "Diana");
// ऑपरेटर लागू करें names.filter(name -> name.length() > 3) .map(String::toUpperCase) .subscribe( result -> System.out.println("प्राप्त: " + result), error -> System.err.println("त्रुटि: " + error), () -> System.out.println("स्ट्रीम समाप्त") );
// Mono — एक एलिमेंट के लिए Mono<String> greeting = Mono.just("Hello, Reactive!"); greeting.subscribe(System.out::println); }}निष्पादन का परिणाम:
प्राप्त: ALICEप्राप्त: CHARLIEप्राप्त: DIANAस्ट्रीम समाप्तHello, Reactive!RxJava: Observable, Flowable और Single
RxJava, Reactive Extensions (Rx) का जावा में पोर्ट किया गया इम्प्लीमेंटेशन है। संस्करण 3.x (RxJava 3) में निम्नलिखित मुख्य प्रकार उपलब्ध हैं:
- Observable<T> — 0..N एलिमेंट वाली स्ट्रीम, backpressure समर्थन के बिना।
- Flowable<T> — 0..N एलिमेंट वाली स्ट्रीम, backpressure समर्थन के साथ।
- Single<T> — बिल्कुल एक एलिमेंट या त्रुटि वाली स्ट्रीम।
- Maybe<T> — 0 या 1 एलिमेंट वाली स्ट्रीम।
- Completable — बिना डेटा वाली स्ट्रीम, केवल समाप्ति या त्रुटि का संकेत।
उदाहरण: Observable और ऑपरेटरों के साथ काम करना
import io.reactivex.rxjava3.core.Observable;import io.reactivex.rxjava3.core.Single;
public class RxJavaExample { public static void main(String[] args) { // संख्याओं की श्रेणी से Observable बनाएं Observable<Integer> numbers = Observable