Esta guía proporciona información sobre el controlador de Java Reactive Streams y su API asíncrona. La guía también enumera y explica muestras de implementaciones personalizadas de suscriptores.
Nota
Para obtener instrucciones sobre cómo instalar el controlador, consulte la Guía deinicio rápido.
reactive streams
Esta librería es una implementación de la especificación de flujos reactivos. La API de flujo reactivo consta de los siguientes componentes:
A Publisher es un proveedor de una cantidad potencialmente ilimitada de elementos secuenciados, publicados según la demanda recibida de su Subscriber o de múltiples instancias de Subscriber.
En respuesta a una llamada a Publisher.subscribe(Subscriber), las posibles secuencias de invocación para métodos en la clase Subscriber se determinan mediante el siguiente protocolo:
onSubscribe onNext* (onError | onComplete)?
Esto significa que onSubscribe siempre es señalizado, seguido de un número posiblemente ilimitado de señales onNext, según lo solicitado por Subscriber. A esto le sigue una señal onError si hay una falla o una señal onComplete cuando no hay más elementos disponibles, siempre que no se haya cancelado el Subscription.
Tip
Para aprender más sobre los flujos reactivos, visita la documentación de Flujos Reactivos.
Suscriptores
La API del driver Java de Streams Reactivos refleja la API del driver Java Sync y cualquier método que cause I/O de red para devolver un tipo Publisher<T>, donde T es el tipo de respuesta para la operación.
Nota
Todos los tipos Publisher devueltos por la API son fríos, lo que significa que no ocurre nada hasta que se suscriben. Así que simplemente crear un Publisher no provocará ningún tipo de I/O en la red. No es hasta que se llama al método Publisher.subscribe() cuando el controlador ejecuta la operación.
Los publicadores en esta implementación son unicast. Cada Subscription a un Publisher corresponde a una sola operación de MongoDB, y el Subscriber de la instancia Publisher recibe su propio conjunto específico de resultados.
Implementaciones de suscriptores personalizados
En la documentación de Java Reactive Streams, hemos implementado diferentes tipos de Subscriber. Aunque este es un escenario artificial para flujos reactivos, bloqueamos los resultados de un ejemplo antes de comenzar el siguiente para garantizar el estado de la base de datos. Para ver el código fuente de todas las implementaciones personalizadas de suscriptores, consulta SubscriberHelpers.java en el código fuente del driver.
ObservableSubscriber- La clase base del suscriptor es el ObservableSubscriber<T>, un
Subscriberque almacena los resultados delPublisher<T>. También contiene un métodoawait()para que podamos bloquear los resultados y garantizar el estado de la base de datos antes de pasar al siguiente ejemplo.
OperationSubscriber- Una implementación del
ObservableSubscriberque llama inmediatamente aSubscription.request()cuando se suscribe a él.
PrintSubscriber- Una implementación de
OperationSubscriberque imprime un mensaje cuando se llama al métodoSubscriber.onComplete().
ConsumerSubscriber- Una implementación de
OperationSubscriberque toma unConsumery llama aConsumer.accept(result)cuando se llama aSubscriber.onNext(T result).
PrintToStringSubscriber- Una implementación de
ConsumerSubscriberque imprime la versión de cadena deresultcuando se llama al métodoSubscriber.onNext().
PrintDocumentSubscriber- Una implementación del
ConsumerSubscriberque imprime la versión JSON de un tipoDocumentcuando se llama al métodoSubscriber.onNext().
Ejemplos bloqueantes y no bloqueantes
Como nuestros tipos Subscriber contienen un pestillo que solo se libera al llamar al método onComplete() del Subscriber, podemos usar ese pestillo para bloquear acciones posteriores llamando al método await. Los dos ejemplos siguientes usan nuestra solicitud automática PrintDocumentSubscriber.
El primero no es bloqueante y el segundo se bloquea esperando a que Publisher se complete:
// 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, Suscriptores y Suscripciones
En general, los tipos Publisher, Subscriber y Subscription comprenden una API de bajo nivel, y se espera que los usuarios y las bibliotecas desarrollen APIs más expresivas sobre ellas en lugar de utilizar únicamente estas interfaces. Como una librería destinada exclusivamente a implementar estas interfaces, los usuarios se beneficiarán de este ecosistema en crecimiento, que es un principio de diseño fundamental en reactive streams.