SpringOne 2GX 2015 のセッション紹介。
今回は、「Introducing RxJava into a Spring Boot REST API」
こちらがスライド。
実際のセッションではデモコードを交えて説明していた。以下がそのソースコード。
https://github.com/simonbasle/practicalRx
なぜ?
「ブロッキングは悪だ」
「Reactive で、並列可能で、組みやすく、読みやすい、非同期コードが必要だ」
どうやって?
Java には2つの方法があるがどちらも欠点がある
Callback を用いたやり方
→ ネストが深くなって Callback地獄 になる
Futures<T> を用いたやり方
→ 簡単にブロックできて(されて)しまう
そこで RxJava
RxJava は Netflix 社のオープンソースライブラリ。
Iterable - Iterator が "プル" 型の実装だとすれば、RxJava は、Observable - Observer で表現する "プッシュ側" の実装。
RxJava は Reactive Manifesto のアーキテクチャに基づく、akka や reactor と並ぶ Reactive Streams の実装の1つ。
どうやって動くの?
Observer<T>
onNext(T data) - 次のデータを通知する
onCompleted() - ストリームの終わりを通知する
onError(Throwable t) - 例外を通知する
Observable<T>
stream を組み立て、伝播させる
1. 生成する
Observable のファクトリーメソッド
just - 1つのオブジェクトから生成する
from - List などの Collection から生成する
create
簡単使い方
map
ブロッキングに戻す
toBlocking
2. 変換する
flatMap
reduce
3. フィルターする
filter
take
takeUntil
4. カウントする
count
5. 副作用をおこす
doOnNext
doOnError
doOnCompleted
doOnEach
6. 結合する
concat - シンプルな結合
merge - 中間レベルの結合
zip - 高度な結合
7. リトライする
retry
onErrorReturn
onErrorResumeNext
トピック: Hot vs Cold
8. 伝播する
zipWith - 役立つ
9. コントローラー
DeferredResult<T> を使う
ReturnValueHandler を使う