البرمجة التفاعلية في Java: Project Reactor و RxJava
البرمجة التفاعلية هي نموذج تطوير يركز على معالجة تدفقات البيانات والأحداث غير المتزامنة. في Java، انتشر هذا النموذج على نطاق واسع بفضل المكتبات التي تنفذ مواصفة Reactive Streams. أشهر تطبيقين هما Project Reactor (أساس Spring WebFlux) و RxJava (الإضافات التفاعلية لـ Java).
على عكس النهج الأمري التقليدي، تتيح البرمجة التفاعلية العمل بكفاءة مع كميات كبيرة من البيانات دون حظر سلاسل التنفيذ. هذا مهم بشكل خاص لتطبيقات الويب الحديثة عالية التحميل، والخدمات المصغرة، وأنظمة الوقت الفعلي.
المفاهيم الأساسية للبرمجة التفاعلية
يقوم النهج التفاعلي على ثلاثة مفاهيم رئيسية:
- Observable (الناشر) — مصدر البيانات الذي يمكنه توليد الأحداث (العناصر، الأخطاء، الإكمال).
- Observer (المشترك) — مستهلك البيانات الذي يتفاعل مع الأحداث.
- المشغلات (Operators) — دوال تحويل التدفقات (map, filter, flatMap, combineLatest وغيرها).
تتبع التدفقات التفاعلية مبدأ backpressure (الضغط العكسي): يمكن للمشترك إبلاغ الناشر بعدد العناصر التي يمكنه معالجتها، مما يمنع تجاوز سعة الذاكرة.
Project Reactor: Flux و Mono
Project Reactor هي مكتبة تفاعلية من Pivotal (الآن VMware)، وهي أساس Spring WebFlux. توفر نوعين رئيسيين:
- Flux<T> — تدفق يمكن أن يحتوي على 0 أو 1 أو العديد من العناصر (تسلسل غير متزامن).
- Mono<T> — تدفق يحتوي على 0 أو عنصر واحد (مشابه لـ 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) تم نقله إلى Java. في الإصدار 3.x (RxJava 3)، تتوفر الأنواع الرئيسية التالية:
- Observable<T> — تدفق يحتوي على 0..N عنصر، بدون دعم backpressure.
- Flowable<T> — تدفق يحتوي على 0..N عنصر، مع دعم backpressure.
- Single<T> — تدفق يحتوي على عنصر واحد بالضبط أو خطأ.
- Maybe<T> — تدفق يحتوي على 0 أو عنصر واحد.
- 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