Blokování je špatné, protože váže vlákno čekající na odpověď. Je to velmi špatné v reaktivním rámci, který má k dispozici málo vláken a je navržen tak, aby žádné z nich by měly být zbytečně blokovány.
To je právě věc, které jsou reaktivní rámce navrženy, aby se vyhnuly, takže v tomto případě vám to jednoduše zabrání:
Váš nový kód naproti tomu funguje asynchronně. Vlákno není blokováno, protože se ve skutečnosti nic neděje, dokud úložiště nevrátí hodnotu (a poté lambda, kterou jste předali savedQuote.subscribe()
se provede a vytiskne váš výsledek do konzole.)
Nový kód však stále není optimální / normální z pohledu reaktivních streamů, protože veškerou svou logiku děláte ve své metodě odběru. Normální věc, kterou musíte udělat, je použít sérii volání flatMap/map k transformaci položek ve streamu a použít doOnNext()
pro vedlejší účinky (jako je tisk hodnoty):
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
Pokud děláte seriózní práci s reaktorovými/reaktivními proudy, stálo by za to si je přečíst obecně. Jsou velmi výkonné pro práci bez blokování, ale vyžadují jiný způsob myšlení (a kódování) než „standardnější“ Java.