MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ausnahme beim Ausführen von block () für das Mono-Objekt, das ich vom ReactiveMongoRepository-Objekt zurückerhalten habe

Blockieren ist schlecht, da es einen Thread blockiert, der auf eine Antwort wartet. Es ist sehr schlecht in einem reaktiven Framework, das wenige Threads zur Verfügung hat und so konzipiert ist, dass keine von ihnen sollten unnötig blockiert werden.

Das ist genau das, was reaktive Frameworks vermeiden sollen, also hält es Sie in diesem Fall einfach davon ab:

Ihr neuer Code hingegen arbeitet asynchron. Der Thread wird nicht blockiert, da eigentlich nichts passiert, bis das Repository einen Wert zurückgibt (und dann das Lambda, das Sie an savedQuote.subscribe() übergeben haben ausgeführt wird und Ihr Ergebnis auf der Konsole ausgibt.)

Der neue Code ist jedoch aus Sicht der reaktiven Streams immer noch nicht optimal / normal, da Sie Ihre gesamte Logik in Ihrer Abonnementmethode ausführen. Normalerweise müssen wir eine Reihe von flatMap/map-Aufrufen verwenden, um die Elemente im Stream umzuwandeln, und doOnNext() verwenden für Seiteneffekte (zB Ausdruck eines Wertes):

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

Wenn Sie ernsthaft mit Reaktor- / Reaktivströmen arbeiten, lohnt es sich, sich allgemein darüber zu informieren. Sie sind sehr leistungsfähig für nicht-blockierendes Arbeiten, aber sie erfordern eine andere Denkweise (und Codierung) als mehr "Standard"-Java.