【Programming】RxJavaリアクティブプログラミング vol.1 / リアクティブプログラミングの概要

in #promari6 years ago (edited)

o1AJ9qDyyJNSpZWhUgGYc3MngFqoAMxopALi6Zh4C8ck3F7cr.png

業務で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)の関係で成り立つ。

ocnin23ywm.png

Source:JAVA 9: LEARNING THE NEW FEATURES – PART 3

  • PublisherとSubscriberのシーケンス図

f0vyyjfk2h.png

Source:RxJavaリアクティブプログラミング

1.2.3 Reactive Steamsのインタフェース

インターフェース説明
Publisherデータを生産し通知する役割を持つインターフェース
Subscriber通知されたデータを受け取り処理を行うインターフェース
Subscriptionデータ数のリクエストおよび購読の解除を行えるインターフェース
ProcessorPublisherとSubscriberの両方の性質を持つインターフェース

b76920vga1.png

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の概要」についてまとめてみます。

t0r78hqbeu.png
written by tamito0201

プログラミングとのご縁結びならプロマリへ。

オンラインプログラミング学習スクールのプロマリは、プログラミングの初学者の皆様を応援しています。プログラミング講師と一緒に面白いアプリを作りませんか。

btpb5hmlur.png

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.