デバッグは、これらのデータ構造を使い始めた後に直面しなければならない主な課題の1つです。Streamsがここ数年で人気を集めていることを念頭に置いて、このタスクを効率的に実行する方法を知っておくことをお勧めします。リアクティブスタックを使用してプロジェクトを設定することから始めましょう。2.バグのあるシナリオいくつかの非同期プロセスが実行されていて、最終的に例外を引き起こす可能性があるコード内のいくつかの欠陥を導入した、実際のシナリオをシミュレートしたいです。オブジェクトのストリームを消費および処理することになります。詳細についてはhttps://github.com/eugenp/tutorials/tree/master/spring-5-reactive[ここのプロジェクト]をご覧ください。ログ出力の分析では、未処理のエラーが発生したときにスニペットとそれが生成する出力を調べてみましょう。flux.subscribe();}アプリケーションを数秒間実行した後、時々例外がログに記録されることがわかります。エラーの1つをよく見ると、これに似たものが見つかります。__valueで処理されていると想像できます。これは単なる単純化されたケースであり、解決策はかなり明白に思えます。これが実際のシナリオで、例外自体がコンテキスト情報なしで問題を解決するのに役立たない場合を想像してみてください。フィールドに影響を与えましたか?ログエントリは、これらの質問を理解するのに役立ちません。悪いことに、私たちの機能の中から例外がスローされないこともあります。オブジェクトを永続化するためにリアクティブリポジトリに依存しているとします。その時点でエラーが発生した場合、コードのデバッグをどこから開始するかについての手がかりさえないかもしれません。リアクティブストリームを効率的にデバッグするためのツールが必要です。3.デバッグセッションを使う私たちのアプリケーションで何が起こっているのかを理解するための一つの選択肢は、私たちのお気に入りのIDEを使ってデバッグセッションを開始することです。ストリーム内の各ステップが実行されたときに、条件付きブレークポイントをいくつか設定し、データの流れを分析する必要があります。実際、これは面倒な作業になる可能性があります。多数のリアクティブプロセスが実行され、リソースを共有している場合は特にそうです。セキュリティ上の理由からデバッグセッションを開始できない状況も数多くあります。関数をチェーニングすることができます。error);}).subscribe();例外を発生させた実際の要素についてはまだ多くの情報がありませんが、エラーがどこから発生しているのかについてのガイダンスがあります。]クラスが用意されています。次の文を追加するだけで、アプリケーションはパブリッシャのメソッドへの呼び出しを計測し、演算子の構成をラップし、スタックトレースをキャプチャします**。Hooks.onOperatorDebug();デバッグモードが有効になった後、私たちの例外ログはいくつかの役に立つ情報を含みます。c.d.b.c.s.FooReporter.reportResult(FooReporter.java:15)ご覧のとおり、最初のセクションは比較的同じですが、次のセクションでは以下について説明します。メソッドで最初に生成されました。エラーが最初に発生した後にエラーを観察したオペレータそれらが連鎖していたユーザクラスで。注:この例では、主にこれを明確にするために、さまざまなクラスに対する操作を追加しています。オブジェクトには影響しません。留意すべきもう1つの側面は、ストリーム上で異なるスレッドが動作している場合でもアセンブリトレースが正しく生成されることです。次の例を見てみましょう。.subscribe();}ログを確認すると、この場合、最初のセクションは少し変わる可能性がありますが、最後の2つのセクションはほぼ同じです。最初の部分はスレッドスタックのトレースなので、特定のスレッドによって実行された操作のみを表示します。これまで見てきたように、これはアプリケーションをデバッグするときの最も重要なセクションではないので、この変更は受け入れられます。6.単一プロセスでデバッグ出力を有効にする反応プロセスごとにスタックトレースを計測して生成するのはコストがかかります。前者のアプローチは、重大な場合にのみ実装する必要があります。Reactorは単一の重要なプロセスでデバッグモードを有効にする方法を提供します。flux.subscribe();}このようにして、アセンブリトレースはチェックポイント段階で記録されます。メソッドを実装する必要があります。なければ、オペレータは下流で発生しているエラーを観察することができません。ライブラリにはオーバーロードメソッドが用意されています。塗りつぶされたスタックトレースを生成する(これは最もコストのかかる操作です)カスタムの説明だけを提供する7.一連の要素を記録する最後に、Reactorパブリッシャーは、場合によっては便利になる可能性があるもう1つの方法を提供します。メソッドを呼び出すことによって、アプリケーションはフロー内の各要素をその段階での状態でログに記録します。例で試してみましょう。flux.subscribe();}そして、ログを確認してください。オブジェクトの状態、および例外が発生したときにフレームワークがフローをキャンセルする方法を簡単に確認できます。この方法もコストがかかるので、控えめに使用する必要があります。8.まとめアプリケーションを正しくデバッグするためのツールやメカニズムがわからない場合は、問題のトラブルシューティングに時間と労力を費やすことになります。これは、リアクティブデータ構造や非同期データ構造の処理に慣れていない場合に特に当てはまります。物事の仕組みを理解するために特別な支援が必要な場合もあります。いつものように、完全な例はhttps://github.com/eugenp/tutorials/tree/master/spring-5-reactive[Githubリポジトリ]にあります。