Tagbangers Blog

Introducing RxJava into a Spring Boot REST API - SpringOne 2GX '15

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 を使う