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".