sql >> Databáze >  >> NoSQL >> MongoDB

Získání výjimky při provádění block() na objektu Mono Dostal jsem se zpět z objektu ReactiveMongoRepository

Blokování je špatné, protože váže vlákno čekající na odpověď. Je to velmi špatné v reaktivním rámci, který má k dispozici málo vláken a je navržen tak, aby žádné z nich by měly být zbytečně blokovány.

To je právě věc, které jsou reaktivní rámce navrženy, aby se vyhnuly, takže v tomto případě vám to jednoduše zabrání:

Váš nový kód naproti tomu funguje asynchronně. Vlákno není blokováno, protože se ve skutečnosti nic neděje, dokud úložiště nevrátí hodnotu (a poté lambda, kterou jste předali savedQuote.subscribe() se provede a vytiskne váš výsledek do konzole.)

Nový kód však stále není optimální / normální z pohledu reaktivních streamů, protože veškerou svou logiku děláte ve své metodě odběru. Normální věc, kterou musíte udělat, je použít sérii volání flatMap/map k transformaci položek ve streamu a použít doOnNext() pro vedlejší účinky (jako je tisk hodnoty):

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

Pokud děláte seriózní práci s reaktorovými/reaktivními proudy, stálo by za to si je přečíst obecně. Jsou velmi výkonné pro práci bez blokování, ale vyžadují jiný způsob myšlení (a kódování) než „standardnější“ Java.




  1. Multi-sbírka, multi-dokumentové 'transakce' v MongoDB

  2. Jak vyhledám objekt podle jeho ObjectId v mongo konzoli?

  3. mongodb - Najít dokument s nejbližší celočíselnou hodnotou

  4. Počet společných výskytů pomocí agregačního rámce Mongo