Reactive Programming là một mô hình lập trình mà ở đó bất kỳ sự thay đổi nào trên đối tượng có các đối tượng khác tham chiếu tới thì các đối tượng tham chiếu tới đó đều nhận biết sự thay đổi của đối tượng đó.
Một ví dụ điển hình mà các bạn nếu nghiên cứu về Reactive Programming trên mạng sẽ gặp đó là:
Nếu mình có biến a là tổng của 2 số b và c, thì bất kỳ sự thay đổi nào của biến b và biến c đều làm thay đổi giá trị của biến a.
Trong những mô hình lập trình khác thì mặc dù a là tổng của b và c nhưng khi chúng ta thay đổi b hoặc c thì giá trị của a vẫn không thay đổi theo. Ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.example; public class Example { public static void main(String[] args) { int b = 2; int c = 3; int a = b + c; System.out.println("Before changing b, a=" + a); b = 5; System.out.println("After changing b, a=" + a); } } |
Kết quả:
Với Reactive Programming thì giá trị của a, sau khi thay đối giá trị của b, sẽ thay đổi. Thay đổi như thế nào thì các bạn đọc tiếp nhé! Nhưng trước tiên, mình cần trình bày với các bạn một số khái niệm trong Reactive Programming mà các bạn cần phải biết.
- Đầu tiên là khái niệm Publisher, là đối tượng sẽ có sự thay đổi giá trị.
Trong ví dụ trên thì b hoặc c chính là những đối tượng Publisher.
- Thứ hai là khái niệm Subscriber, đây chính là những đối tượng sẽ nhận sự thay đổi từ các đối tượng Publisher.
Trong ví dụ trên thì a chính là một đối tượng Subscriber.
- Và khái niệm cuối cùng chính là Subscribe, chính là phần kết nối giữa Publisher và Subscriber để Publisher có thể thông báo sự thay đổi đến Subscriber.
Để minh hoạ cho mô hình Reactive Programming, mình sẽ viết lại ví dụ trên và sử dụng thư viện RxJava (Reactive Extensions for the JVM). RxJava là một thư viện dùng để triển khai mô hình lập trình Reactive Programming trong Java với đầy đủ các function giúp lập trình viên có thể triển khai Reactive Programming một cách dễ dàng.
Nhưng trước tiên, mình sẽ tạo một Maven project mới với RxJava dependency:
Với RxJava dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.10</version> </dependency> |
Trong thư viện RxJava thì đối tượng Observable hoặc Flowable là đại diện cho một Publisher, còn đối tượng Consumer hoặc Subscriber là đại diện cho Subscriber.
Ở ví dụ trên của mình thì để tạo ra Publisher, mình có thể khai báo như sau:
1 |
Observable<Integer> b = Observable.just(2, 5); |
Với khai báo này, đối tượng Observable sẽ tạo ra 2 giá trị là 2 và 5 và những giá trị này sẽ được cập nhập đến cho các Subscriber.
Để tạo ra đối tượng Subscriber, mình sẽ sử dụng đối tượng Consumer như sau:
1 2 3 4 5 6 7 8 9 |
Consumer<Integer> consumer = new Consumer<Integer>() { int a = 0; public void accept(Integer number) throws Exception { a = number + c; System.out.println(a); } }; |
Và để kết nối Publisher và Subscriber ở trên, chúng ta sẽ sử dụng phương thức subscribe() của đối tượng Observable:
1 |
b.subscribe(consumer); |
Khi chạy, ứng với mỗi giá trị mà Publisher phát ra, Subscriber sẽ nhận được giá trị đó và cập nhập lên biến a.
Dưới đây là toàn bộ code của chương trình:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava.reactive; import io.reactivex.Observable; import io.reactivex.functions.Consumer; public class Example { public static void main(String[] args) { Observable<Integer> b = Observable.just(2, 5); final int c = 3; Consumer<Integer> consumer = new Consumer<Integer>() { int a = 0; public void accept(Integer number) throws Exception { a = number + c; System.out.println(a); } }; b.subscribe(consumer); } } |
Kết quả:
Minh
Em chào anh. em muốn làm một ứng dụng gọi điện video và voiceChat dùng socket. Em có tìm hiểu được trên mạng thì thấy họ dùng RTP và JMF. Tuy nhiên những bài đăng đó thường là lâu lắm rồi. Anh có thể cho em một số từ khóa để tìm hiểu về vấn đề này được không ạ?
Author
không nha em :))
DOTRINH.COM
Nice!
Thank you!