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

Får undtagelse, mens jeg laver blok() på Mono-objekt, jeg kom tilbage fra ReactiveMongoRepository-objekt

Blokering er dårlig, da den binder en tråd, der venter på et svar. Det er meget dårligt i en reaktiv ramme, som har få tråde til sin rådighed, og er designet således, at ingen af dem bør blokeres unødigt.

Dette er netop det, som reaktive rammer er designet til at undgå, så i dette tilfælde stopper det dig simpelthen med at gøre det:

Din nye kode fungerer derimod asynkront. Tråden er ikke blokeret, da der faktisk ikke sker noget, før repository returnerer en værdi (og derefter lambdaen, som du sendte til savedQuote.subscribe() udføres, og resultatet udskrives til konsollen.)

Den nye kode er dog stadig ikke optimal/normal set fra et reaktivt strømperspektiv, da du laver al din logik i din abonnementsmetode. Den normale ting at gøre er for os en række flatMap/map-kald for at transformere elementerne i strømmen og bruge doOnNext() for bivirkninger (såsom udskrivning af en værdi):

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

Hvis du laver noget seriøst arbejde med reaktor/reaktive strømme, ville det være værd at læse om dem generelt. De er meget kraftfulde til ikke-blokerende arbejde, men de kræver en anden måde at tænke på (og kodning) end mere "standard" Java.




  1. MongoDB - Maksimal filstørrelse ved hjælp af GridFS

  2. Sådan kommer du i gang med databaseautomatisering

  3. Er det ok at omdanne mongo ObjectId til en streng og bruge det til URL'er?

  4. mongodb opdaterer alle dokumenter med at øge værdien med 1