Il blocco è negativo, poiché lega un thread in attesa di una risposta. È molto cattivo in un framework reattivo che ha pochi thread a sua disposizione ed è progettato in modo che nessuno di essi dovrebbero essere bloccati inutilmente.
Questa è proprio la cosa che i framework reattivi sono progettati per evitare, quindi in questo caso ti impedisce semplicemente di farlo:
Il tuo nuovo codice, al contrario, funziona in modo asincrono. Il thread non è bloccato, poiché in realtà non accade nulla fino a quando il repository non restituisce un valore (e quindi il lambda che hai passato a savedQuote.subscribe()
viene eseguito, stampando il risultato sulla console.)
Tuttavia, il nuovo codice non è ancora ottimale/normale dal punto di vista dei flussi reattivi, poiché stai facendo tutta la tua logica nel tuo metodo di iscrizione. La cosa normale da fare è una serie di chiamate flatMap/map per trasformare gli elementi nello stream e usare doOnNext()
per gli effetti collaterali (come la stampa di un valore):
stockQuoteClient.getQuoteStream()
.log("quote-monitor-service")
.flatMap(quoteRepository::insert)
.doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
.subscribe();
Se stai facendo una seria quantità di lavoro con reattori / flussi reattivi, varrebbe la pena leggerli in generale. Sono molto potenti per il lavoro non bloccante, ma richiedono un modo diverso di pensare (e codificare) rispetto a Java più "standard".