ブロッキングは、応答を待機しているスレッドを拘束するため、悪い結果になります。 とても 自由に使えるスレッドがほとんどなく、なしになるように設計されているリアクティブフレームワークでは良くありません。 そのうちの1つを不必要にブロックする必要があります。
これは、リアクティブフレームワークが回避するように設計されていることそのものであるため、この場合は、単にそれを停止します。
対照的に、新しいコードは非同期で機能します。リポジトリが値(そしてsavedQuote.subscribe()
に渡したラムダ)を返すまで実際には何も起こらないため、スレッドはブロックされません。 が実行され、結果がコンソールに出力されます。)
ただし、サブスクライブメソッドですべてのロジックを実行しているため、リアクティブストリームの観点からは、新しいコードはまだ最適/正常ではありません。通常は、一連のflatMap / map呼び出しを使用してストリーム内のアイテムを変換し、doOnNext()
を使用します。 副作用(値の印刷など)の場合:
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
リアクター/リアクティブストリームで深刻な量の作業を行っている場合は、一般的にそれらを読む価値があります。これらはノンブロッキング作業には非常に強力ですが、より「標準的な」Javaとは異なる考え方(およびコーディング)が必要です。