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 Primeros pasos.
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:
Un Publisher es un proveedor de un número potencialmente ilimitado de elementos secuenciados, publicados de acuerdo con 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 Reactive Streams.
Suscriptores
La API del controlador Java Reactive Streams refleja la API del controlador Java Sync y cualquier método que haga que la E/S de red devuelva un Publisher<T> tipo, donde T es el tipo de respuesta para la operación.
Nota
Todos los Publisher tipos que devuelve la API son fríos, lo que significa que no ocurre nada hasta que se suscriben a ellos. Por lo tanto, crear un no Publisher provocará ninguna operación de entrada/salida de red.Publisher.subscribe() El controlador no ejecuta la operación hasta que se llama al método.
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 personalizadas de suscriptores
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 ObservableSubscriber,<T> un
Subscriberque almacena los resultadosPublisher<T>del. También contiene unawait()método para que podamos bloquear los resultados y asegurar 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 del
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 en string delresultcuando 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 cuando se llama al método onComplete() de Subscriber, podemos usar ese pestillo para bloquear acciones posteriores llamando al método await. Los dos siguientes ejemplos utilizan nuestra PrintDocumentSubscriber de solicitud automática.
El primero es no bloqueante y el segundo bloquea esperando a que se complete el 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, 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.