# रिएक्टिव प्रोग्रामिंग परिचय — Advanced Java: Streams, Concurrency, JVM और Spring

Source: https://www.skillbyai.com/hi/advanced-java/adv-reactive-streams

> रिएक्टिव स्ट्रीम जो समस्या हल करते हैं वह देखें — लोड में ब्लॉक होते थ्रेड — और Mono व Flux पर बने न्यूनतम non-blocking WebFlux endpoint को पढ़ें।

## समस्या: प्रति रिक्वेस्ट एक थ्रेड

पारंपरिक (servlet) रिक्वेस्ट हैंडलर धीमी downstream कॉल की प्रतीक्षा में अपना थ्रेड रोक देता है — भारी लोड में थ्रेड ख़त्म हो जाते हैं जबकि CPU खाली, केवल I/O की प्रतीक्षा में है। **Reactive** प्रोग्रामिंग (Reactive Streams / Project Reactor) इसकी बजाय एक callback पंजीकृत करती है और प्रतीक्षा के दौरान थ्रेड को दूसरे काम के लिए मुक्त कर देती है।

## Mono व Flux

`Mono<T>` शून्य-या-एक असिंक्रोनस मान दर्शाता है, `Flux<T>` शून्य-से-अनेक — दोनों लेज़ी हैं: जब तक कोई **subscribe** न करे कुछ नहीं चलता। Spring WebFlux कंट्रोलर परिणाम के लिए ब्लॉक होने की बजाय इन्हें सीधे लौटाते हैं।

```java
@RestController
class UserController {
    private final WebClient client;

    @GetMapping("/users/{id}")
    Mono<User> get(@PathVariable String id) {
        return client.get()
            .uri("/legacy-users/{id}", id)
            .retrieve()
            .bodyToMono(User.class);   // non-blocking
    }
}
```

## यह कब उपयोगी है (और कब नहीं)

उच्च-समरूपता वाली I/O-भारी सेवाओं (gateway, streaming) में reactive चमकता है। सामान्य लोड की CRUD ऐप के लिए **वर्चुअल थ्रेड** (Java 21+) पर सामान्य ब्लॉकिंग कोड जितना ही स्केलेबल है पर कहीं सरल — reactive केवल मापी गई ज़रूरत पर अपनाएँ।

## अंतिम क्विज़ 1/8

अंतिम क्विज़

**Quiz:** कौन-सी सुविधा behaviour को argument के रूप में देने देती है?

- [ ] Static imports
- [ ] Annotations
- [x] Lambda expressions
- [ ] Packages

*Answer:* Lambda expressions. Lambdas functional interfaces लागू करते हैं।

## अंतिम क्विज़ 2/8

अंतिम क्विज़

**Quiz:** Stream.map क्या करता है?

- [ ] Filters elements
- [ ] Terminates the stream
- [ ] Sorts keys
- [x] Transforms each element

*Answer:* Transforms each element. map हर element पर function लगाता है।

## अंतिम क्विज़ 3/8

अंतिम क्विज़

**Quiz:** अनुपस्थित values को कौन-सा class सुरक्षित रूप से संभालता है?

- [x] Optional
- [ ] Object
- [ ] Void
- [ ] Number

*Answer:* Optional. Optional अनुपस्थित values को स्पष्ट बनाता है।

## अंतिम क्विज़ 4/8

अंतिम क्विज़

**Quiz:** happens-before क्या गारंटी देता है?

- [ ] Faster code
- [x] One thread's writes are visible to another
- [ ] No exceptions
- [ ] Automatic locks

*Answer:* One thread's writes are visible to another. यह threads के बीच memory visibility तय करता है।

## अंतिम क्विज़ 5/8

अंतिम क्विज़

**Quiz:** Thread pools कौन-सा tool संभालता है?

- [ ] Scanner
- [ ] StringBuilder
- [x] ExecutorService
- [ ] Properties

*Answer:* ExecutorService. Executors tasks को threads से अलग करते हैं।

## अंतिम क्विज़ 6/8

अंतिम क्विज़

**Quiz:** कौन-सा Spring concept आपके classes को dependencies देता है?

- [ ] Reflection only
- [ ] JSP
- [ ] Servlets
- [x] Dependency injection

*Answer:* Dependency injection. IoC container beans को जोड़ता है।

## अंतिम क्विज़ 7/8

अंतिम क्विज़

**Quiz:** Passwords को bcrypt से hash क्यों करें?

- [x] So plain text is never stored
- [ ] To make them shorter
- [ ] To speed up login
- [ ] To allow decryption

*Answer:* So plain text is never stored. Hashing data लीक होने पर users की रक्षा करता है।

## अंतिम क्विज़ 8/8

अंतिम क्विज़

**Quiz:** Virtual threads क्या सस्ता बनाते हैं?

- [ ] CPU-bound loops
- [x] Blocking I/O concurrency
- [ ] Memory leaks
- [ ] Compilation

*Answer:* Blocking I/O concurrency. JVM blocked virtual threads को park करता है।
