Exemplos de implementações de assinantes personalizados
Nesta página
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 Publisher
tipos de retornados da API estã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 banco de dados. Para ver o código fonte de todas as implementações de assinantes personalizadas, consulte SubscriberHelpers.java no código-fonte do driver.
ObservableSubscriber
- A classe de assinante base é ObservableSubscriber<T>, um
Subscriber
que 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
ObservableSubscriber
que chama imediatamenteSubscription.request()
quando ela é inscrita.
PrintSubscriber
- Uma implementação do
OperationSubscriber
que imprime uma mensagem quando o métodoSubscriber.onComplete()
é chamado.
ConsumerSubscriber
- Uma implementação de
OperationSubscriber
que recebe umConsumer
e chamaConsumer.accept(result)
quandoSubscriber.onNext(T result)
é chamado.
PrintToStringSubscriber
- Uma implementação de
ConsumerSubscriber
que imprime a versão de string deresult
quando o métodoSubscriber.onNext()
é chamado.
PrintDocumentSubscriber
- Uma implementação do
ConsumerSubscriber
que imprime a versão JSON de um tipoDocument
quando 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.