工作中並沒有使用到,而且我覺得像vertx等優秀的框架已經提供了非常完善的異步事件驅動的功能,Spring也有ApplicationExentPublisher來做類似的事。今天就是寫個入門例子,看看。emmmm
當然這裏只是簡單例子,實際使用中應該進一步封裝,Spring中的ApplicationExentPublisher就是很好的運行方式(封裝思路)的參照物。
public class RxJava {
public static void main(String[] args) {
/**
* 上游消息的產生,這裏的String在實際中就是我們業務上要傳輸的對象
*/
Observable<String> obserbable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("First Msg!");
emitter.onNext("Sceond Msg!");
}
});
/**
* 簡單的事件處理方式
*/
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(Thread.currentThread().getName() + " ----consumer---:" + s);
}
};
/**
* 更豐富的事件處理方式,RxJava2.0是這個 1.0中是另一個類
*/
Observer<String> observer = new Observer<String>() {
@Override
public void onComplete() {
System.out.println(Thread.currentThread().getName()+ " ---Observer.onComplete:");
}
@Override
public void onError(Throwable arg0) {
System.out.println(Thread.currentThread().getName()+ " ---Observer.onError:" + arg0);
}
@Override
public void onNext(String arg0) {
System.out.println(Thread.currentThread().getName()+ " ---Observer.onNext:" + arg0);
}
@Override
public void onSubscribe(Disposable arg0) {
System.out.println(Thread.currentThread().getName()+ " ---Observer.onSubscribe:" + arg0);
}
};
/**
* observeOn是異步處理的關鍵。這裏使用Schedulers.newThread()代表事件處理是新開啓的線程中。
* 實際應用應設置爲線程池,儘量用自定義的,比較可控
*
*/
obserbable.observeOn(Schedulers.newThread()).subscribe(consumer);
obserbable.observeOn(Schedulers.newThread()).subscribe(observer);
/**
* 阻塞住爲了觀察上面兩個事件的執行結果
*/
for(;;);
}
}