RxJavaコンプリートテーブルの組み合わせ
1概要
このチュートリアルでは、https://www.baeldung.com/rx-java
Completable
typeを使用します。これは、実際の値なしの計算結果を表します。
2 RxJavaの依存関係
RxJava 2の依存関係をMavenプロジェクトに含めましょう。
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.2.2</version>
</dependency>
通常、https://search.maven.org/classic/#search%7C1%7Cg%3A%22io.reactivex.rxjava2%22%20AND%20a%3A%22rxjava%22[Mavenに最新バージョンがあります。中央]。
** 3補完タイプ
-
http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html
Observable
唯一の例外として、完了シグナルまたはエラーシグナルのいずれかを生成し、項目を生成しないことを除きます。 -
Completable.complete ()
]を使用して、すぐに完了するインスタンスを生成できます。 **
次に、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/observers/DisposableCompletableObserver.html[
DisposableCompletableObserver
]を使用して、その状態を確認できます。
Completable
.complete()
.subscribe(new DisposableCompletableObserver() {
@Override
public void onComplete() {
System.out.println("Completed!");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});
-
さらに、
Callable、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/functions/Action.html[Action]、およびRunnable
:から
Completable
インスタンスを構築できます。
Completable.fromRunnable(() -> {});
また、
Completable.from()
を使用するか、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Maybe.html#ignoreElementで
ignoreElement()を呼び出すことで、他の型から
Completable__インスタンスを取得できます。 – [多分]、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Single.html#ignoreElement–[シングル]、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#ignoreElements–[Flowable]、およびhttp://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#ignoreElements–[Observable]のソース彼ら自身:
Flowable<String> flowable = Flowable
.just("request received", "user logged in");
Completable flowableCompletable = Completable
.fromPublisher(flowable);
Completable singleCompletable = Single.just(1)
.ignoreElement();
** 4連鎖
補完
実際の使用例では、操作の成功を気にするだけの場合、
Completables
の連鎖を使用できます。
リモートを更新するためにPUTリクエストを実行するような** オールオアナッシングアクション
成功した場合はローカルデータベースの更新が続くオブジェクト
** 事後ログおよびジャーナリング
-
いくつかの行動のオーケストレーション、例えば後に分析ジョブを実行する
取り込みアクションが完了しました
例は単純かつ問題にとらわれないようにします。いくつかの
Completable
インスタンスがあるとします。
Completable first = Completable
.fromSingle(Single.just(1));
Completable second = Completable
.fromRunnable(() -> {});
Throwable throwable = new RuntimeException();
Completable error = Single.error(throwable)
.ignoreElement();
-
2つの
Completables
を1つにまとめるには、
httpを使用できます。 )
演算子** :
first
.andThen(second)
.test()
.assertComplete();
必要に応じて
Completables
を連鎖させることができます。同時に、少なくとも1つのソースが完了できなかった場合、結果として
Completable
も
onComplete()
を起動しません**
first
.andThen(second)
.andThen(error)
.test()
.assertError(throwable);
さらに、** ソースの1つが無限大であるか、何らかの理由で
ComComplete
に達していない場合、結果の
Completable
は
onComplete()
or__onError()も起動しません。
私たちがまだこのシナリオをテストできることは良いことです:
...
.andThen(Completable.never())
.test()
.assertNotComplete();
5一連の補完テーブルを構成する
__Completablesがたくさんあることを想像してみてください。実際の使用例として、いくつかの別々のサブシステム内にユーザーを登録する必要があるとします。
-
すべての
Completables
を1つにまとめるには、http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html#merge-java.lang.Iterable-[
merge
]( )
mege()
演算子はすべてのソースへの登録を許可します。
結果のインスタンスは、すべてのソースが完了すると完了します。さらに、いずれかのソースがエラーを出したときには
onError
で終了します。
Completable.mergeArray(first, second)
.test()
.assertComplete();
Completable.mergeArray(first, second, error)
.test()
.assertError(throwable);
少し異なるユースケースに移りましょう。
Flowable.
から取得したすべての要素に対してアクションを実行する必要があるとしましょう。
それから、アップストリームの完了とすべての要素レベルのアクションの両方に対して単一の
Completable
が必要です。
flatMapCompletable
()演算子は、この場合に役立ちます。
Completable allElementsCompletable = Flowable
.just("request received", "user logged in")
.flatMapCompletable(message -> Completable
.fromRunnable(() -> System.out.println(message))
);
allElementsCompletable
.test()
.assertComplete();
同様に、上記のメソッドは、
Observable
、
Maybe
、または
Single.
などの残りの基本リアクティブクラスにも使用できます。
flatMapCompletable()
の実用的なコンテキストとして、すべての項目を何らかの副作用で装飾することを検討できます。完了した要素ごとにログエントリを書き込むか、または成功した各アクションごとにストレージスナップショットを作成できます。
最後に、** 他のいくつかのソースから
Completable
を作成し、それらのいずれかが完了したらすぐに終了させる必要があるかもしれません。
amb
接頭辞は「あいまいさ」の省略形です。これは、どの
Completable
が正確に完成するかについての不確実性を意味します。たとえば、
ambArray()
:
のようになります。
Completable.ambArray(first, Completable.never(), second)
.test()
.assertComplete();
上記の
__Completable
は、どのソースの補完可能文字が最初に終了するかによって、
onComplete()
ではなく
onError()__で終了することもあります。
Completable.ambArray(error, first, second)
.test()
.assertError(throwable);
また、最初のソースが終了すると、残りのソースは破棄されることが保証されます。
これは、実行中の残りの
Completables
がすべてhttp://reactivex.io/RxJava/2.x/javadoc/io/reactivex/disposables/Disposable.html#dispose–[Disposable.dispose()]および対応するhttp:/によって停止されることを意味します。/reactivex.io/RxJava/2.x/javadoc/io/reactivex/CompletableObserver.html[CompletableObservers]の登録は解除されます。
実用的な例として、バックアップファイルを同等のリモートストレージにストリーミングするときには
amb()
を使用できます。そして、最善のバックアップが終了したら処理を完了するか、エラーが発生したら処理を繰り返します。
6. 結論
この記事では、RxJavaの
__Completable
__typeについて簡単に説明しました。
Completable
インスタンスを取得するためのさまざまなオプションから始めて、
__ andThen()、merge()、flatMapCompletable()、
and
amb …()
演算子を使用して
Completables__をチェーン化して構成しました。
over on GitHub
すべてのコードサンプルのソースを見つけることができます。