البرمجة التفاعلية في Java: مكتبات Project Reactor و RxJava

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة التفاعلية في 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

توصيات