業務でRxJavaを触ることになりましたので要点をまとめてみたいと思います。
1. Introduction
1.1 リアクティブプログラミング
- データが流れるように来ること(ストリーム)に着目し、データを受け取るたびに関連したプログラムが反応(リアクション)して処理を行うようにするプログラミングの考え方
- プログラムが必要なデータを自分から取得し処理をするのではなく、送られてきたデータを受け取るたびに反応して処理をする(リアクティブな処理をする)ようなプログラム
1.2 Reactive Streams
1.2.1 概要
- Reactive Streamsとは、「JVM 上でのノンブロッキングなバックプレッシャーを持つ非同期ストリーム処理の標準」で、 様々な非同期ストリーム処理のインタフェースを共通化して標準的に扱えるようにしようというもの
- Reactive Streamsの仕様に沿っていれば、どのライブラリやフレームワークを使っているのかに関係なく、データストリームを非同期で扱うための共通の仕組みを提供する
1.2.2 Reactive Steamsの構成
- Reactive Streamsの基本的な構成はデータを生産し通知する生産者(Publisher)と、通知されたデータを受け取り処理を行う消費者(Subscriber)の関係で成り立つ。
Source:JAVA 9: LEARNING THE NEW FEATURES – PART 3
- PublisherとSubscriberのシーケンス図
Source:RxJavaリアクティブプログラミング
1.2.3 Reactive Steamsのインタフェース
インターフェース | 説明 |
---|---|
Publisher | データを生産し通知する役割を持つインターフェース |
Subscriber | 通知されたデータを受け取り処理を行うインターフェース |
Subscription | データ数のリクエストおよび購読の解除を行えるインターフェース |
Processor | PublisherとSubscriberの両方の性質を持つインターフェース |
1.2.4 Reactive Streamsのルール
Reactive Streamsの仕組みが機能するために以下のルールに従う必要がある。
- 購読開始の通知(onSubscribe)はその購読で1度だけしか通知されない
- 通知はシーケンシャル(逐次的)に行う。複数の通知を同時に行わない。
- nullを通知しない。nullを通知すると、Reactive Streamsでは、NullPointerExceptionを発生させる仕様になっている。
- Publisherの処理は完了(onComplete)もしくはエラー(onError)を通知することで終了とする
データ数のリクエストや購読の解除を行うSubscriptionに関して次のようなルールが存在する。
- データ数のリクエストにLong.MAX_VALUEを渡した場合、データ数による通知の制限はなくなる
- Subscriptionのメソッドは同期を取った状態で呼ばなければならない
- Subscriptionのメソッドを同時に呼ぶようなことはしてはならない。
※ 各通知のメソッドやSubscriptionのメソッドを呼び出す際に同期が取れており、処理自体がスレッドセーフであるか注意する必要がある。
次回は「【Programming】RxJava リアクティブプログラミング vol.2 / RxJavaの概要」についてまとめてみます。
written by tamito0201
プログラミングとのご縁結びならプロマリへ。
オンラインプログラミング学習スクールのプロマリは、プログラミングの初学者の皆様を応援しています。プログラミング講師と一緒に面白いアプリを作りませんか。
The programming school "Promari" will help you learn programming. "Promari" is supporting the first scholars of programming. Let's develop an application with our programming instructor.
Love up
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
thank you!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit