MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ottenendo un'eccezione durante l'esecuzione di block() sull'oggetto Mono sono tornato dall'oggetto ReactiveMongoRepository

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".