MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Obtendo exceção ao fazer block() no objeto Mono, voltei do objeto ReactiveMongoRepository


Bloquear é ruim, pois amarra uma thread esperando por uma resposta. É muito bad em uma estrutura reativa que tem poucos threads à sua disposição e é projetada para que nenhuma deles devem ser desnecessariamente bloqueados.

Isso é exatamente o que os frameworks reativos são projetados para evitar, então, neste caso, ele simplesmente impede você de fazer isso:

Seu novo código, por outro lado, funciona de forma assíncrona. O encadeamento não está bloqueado, pois nada realmente acontece até que o repositório retorne um valor (e então o lambda que você passou para savedQuote.subscribe() é executado, imprimindo seu resultado no console.)

No entanto, o novo código ainda não é ideal/normal do ponto de vista de fluxos reativos, pois você está fazendo toda a sua lógica no seu método de inscrição. O normal é fazer uma série de chamadas flatMap/map para transformar os itens no fluxo e usar doOnNext() para efeitos colaterais (como imprimir um valor):
stockQuoteClient.getQuoteStream()
            .log("quote-monitor-service")
            .flatMap(quoteRepository::insert)
            .doOnNext(result -> System.out.println("I saved a quote! Id :: " + result.getId())))
            .subscribe();

Se você estiver fazendo algum trabalho sério com fluxos de reatores / reativos, valeria a pena ler sobre eles em geral. Eles são muito poderosos para trabalho sem bloqueio, mas exigem uma maneira diferente de pensar (e codificar) do que o Java mais "padrão".