sql >> Databasteknik >  >> NoSQL >> MongoDB

Att få undantag när jag gjorde block() på Mono-objektet fick jag tillbaka från ReactiveMongoRepository-objektet

Blockering är dåligt eftersom det binder ihop en tråd som väntar på svar. Det är mycket dåligt i ett reaktivt ramverk som har få trådar till sitt förfogande och är utformat så att ingen av dem bör blockeras i onödan.

Det är just detta som reaktiva ramverk är designade för att undvika, så i det här fallet stoppar det dig helt enkelt från att göra det:

Din nya kod fungerar däremot asynkront. Tråden är inte blockerad, eftersom ingenting faktiskt händer förrän förvaret returnerar ett värde (och sedan lambdan som du skickade till savedQuote.subscribe() exekveras och resultatet skrivs ut till konsolen.)

Den nya koden är dock fortfarande inte optimal/normal ur ett reaktivt flödesperspektiv, eftersom du gör all din logik i din prenumerationsmetod. Det normala att göra är för oss en serie flatMap/map-anrop för att transformera objekten i flödet och använda doOnNext() för biverkningar (som att skriva ut ett värde):

stockQuoteClient.getQuoteStream()
            .log("quote-monitor-service")
            .flatMap(quoteRepository::insert)
            .doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
            .subscribe();

Om du gör något seriöst arbete med reaktor/reaktiva strömmar, skulle det vara värt att läsa om dem i allmänhet. De är mycket kraftfulla för icke-blockerande arbete, men de kräver ett annat sätt att tänka (och kodning) än mer "standard" Java.




  1. Hur man hittar slumpmässiga poster i Mongoose

  2. ServiceStack Entities ID-fältnamn

  3. Använda en objektegenskap som argumentet $maxDistance i en mongodb geolokaliseringsfråga

  4. MongoDB:fråga Array för "true" värde vid index n