Blokowanie jest złe, ponieważ wiąże wątek oczekujący na odpowiedź. Jest bardzo źle w reaktywnym frameworku, który ma do dyspozycji niewiele wątków i jest zaprojektowany tak, aby żadne z nich powinny być niepotrzebnie zablokowane.
Jest to dokładnie rzecz, której mają unikać frameworki reaktywne, więc w tym przypadku po prostu przestaje to robić:
Z kolei Twój nowy kod działa asynchronicznie. Wątek nie jest blokowany, ponieważ nic się nie dzieje, dopóki repozytorium nie zwróci wartości (a następnie lambda przekazanego do savedQuote.subscribe()
zostanie wykonane, wypisując wynik do konsoli.)
Jednak nowy kod nadal nie jest optymalny/normalny z perspektywy strumieni reaktywnych, ponieważ wykonujesz całą swoją logikę w metodzie subskrypcji. Normalną rzeczą do zrobienia jest dla nas seria wywołań flatMap/map w celu przekształcenia elementów w strumieniu i użycia doOnNext()
dla efektów ubocznych (takich jak drukowanie wartości):
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
Jeśli wykonujesz jakąkolwiek poważną pracę z reaktorami / strumieniami reaktywnymi, warto ogólnie o nich przeczytać. Są bardzo wydajne w pracy bez blokowania, ale wymagają innego sposobu myślenia (i kodowania) niż bardziej „standardowa” Java.