Este guia fornece informações básicas sobre o driver Java Reactive Streams e sua API assíncrona. O guia também lista e explica exemplos de implementações de assinantes personalizadas.
Observação
Para obter instruções sobre como instalar o driver, consulte o guia deIntrodução .
reactive streams
Esta biblioteca é uma implementação da especificação de fluxos reativos. A API de fluxo reativo consiste nos seguintes componentes:
Um Publisher é um provedor de um número potencialmente ilimitado de elementos sequenciados, publicados de acordo com a demanda recebida de seu Subscriber ou múltiplas instâncias de Subscriber.
Em resposta a uma chamada para Publisher.subscribe(Subscriber), as possíveis sequências de invocação para métodos na classe Subscriber são fornecidas pelo seguinte protocolo:
onSubscribe onNext* (onError | onComplete)?
Isso significa que onSubscribe é sempre sinalizado, seguido por um número possivelmente ilimitado de onNext sinais, conforme solicitado por Subscriber. Isso é seguido por um sinal onError se houver uma falha ou um sinal onComplete quando não houver mais elementos disponíveis, desde que o Subscription não seja cancelado.
Dica
Para saber mais sobre fluxos reativos, acesse a documentação de fluxos reativos.
Assinantes
A API do driver Java Reactive Streams espelha a API do driver Java Sync e quaisquer métodos que fazem com que a E/S da rede retorne um tipo Publisher<T> , em que T é o tipo de resposta para a operação.
Observação
Todos os tipos de Publisher retornados da API são frios, o que significa que nada acontece até que eles sejam inscritos. Portanto, apenas criar um Publisher não causará nenhuma E/S de rede. Não é até que você chame o método Publisher.subscribe() que o driver executa a operação.
Os editores nesta implementação são unicast. Cada Subscription para um Publisher está relacionado a uma única operação do MongoDB, e o Publisher da instância Subscriber recebe seu próprio conjunto específico de resultados.
Implementações de assinantes personalizados
Na documentação do Java Reactive Streams, implementamos diferentes tipos de Subscriber . Embora seja um cenário artificial para fluxos reativos, bloqueamos os resultados de um exemplo antes de iniciar o próximo para garantir o estado do banco de dados. Para ver o código fonte de todas as implementações de assinatura personalizada, consulte SubscriberHelpers.java no código fonte do driver.
ObservableSubscriber- A classe de assinante base é a ObservableSubscriber<T>, um
Subscriberque armazena os resultados doPublisher<T>. Ele também contém um métodoawait()para que possamos bloquear os resultados para garantir o estado do banco de dados antes de prosseguir para o próximo exemplo.
OperationSubscriber- Uma implementação do
ObservableSubscriberque chama imediatamenteSubscription.request()quando ela é inscrita.
PrintSubscriber- Uma implementação do
OperationSubscriberque imprime uma mensagem quando o métodoSubscriber.onComplete()é chamado.
ConsumerSubscriber- Uma implementação de
OperationSubscriberque recebe umConsumere chamaConsumer.accept(result)quandoSubscriber.onNext(T result)é chamado.
PrintToStringSubscriber- Uma implementação de
ConsumerSubscriberque imprime a versão de string deresultquando o métodoSubscriber.onNext()é chamado.
PrintDocumentSubscriber- Uma implementação do
ConsumerSubscriberque imprime a versão JSON de um tipoDocumentquando o métodoSubscriber.onNext()é chamado.
Exemplos de bloqueio e não bloqueio
Como nossos tipos de Subscriber contêm uma trava que só é liberada quando o método onComplete() do Subscriber é chamado, podemos usar essa trava para bloquear outras ações chamando o método await . Os dois exemplos a seguir usam nosso PrintDocumentSubscriber de solicitação automática .
O primeiro não está bloqueando e o segundo bloqueia aguardando a conclusão do Publisher :
// Create a publisher Publisher<Document> publisher = collection.find(); // Non-blocking publisher.subscribe(new PrintDocumentSubscriber()); Subscriber<Document> subscriber = new PrintDocumentSubscriber(); publisher.subscribe(subscriber); subscriber.await(); // Block for the publisher to complete
Editores, assinantes e assinaturas
Em geral, os tipos Publisher, Subscriber e Subscription compreendem uma API de baixo nível e espera-se que os usuários e as bibliotecas criem APIs mais expressivas sobre eles, em vez de usar apenas essas interfaces. Como uma biblioteca que implementa apenas essas interfaces, os usuários se beneficiarão desse ecossistema em crescimento, que é um princípio fundamental de design dos fluxos reativos.