Overview
Cuando se utiliza el controlador de Java Reactive Streams para realizar una operación del servidor, también existe la opción de limitar la cantidad de tiempo en la que el servidor puede finalizar la operación. Para ello, especifica un tiempo de espera de operación del lado del cliente (CSOT). El tiempo de espera se aplica a todos los pasos necesarios para completar la operación, incluyendo la selección del servidor, la salida de conexión y la ejecución del lado del servidor. Cuando expire el tiempo de espera, el controlador de Java Reactive Streams genera una excepción por tiempo de espera.
Nota
Funcionalidad Experimental
La funcionalidad CSOT es experimental y podría cambiar en futuras versiones de driver.
timeoutMS Opción
Para especificar un tiempo de espera al conectarse a una implementación de MongoDB, configure el
timeoutMS opción de conexión para la duración del tiempo de espera en milisegundos. Puedes establecer la opción timeoutMS de las siguientes maneras:
Llamando al método
timeout()de la claseMongoClientSettings.BuilderConfigurar el parámetro
timeoutMSen su cadena de conexión
Los siguientes ejemplos de código establecen un tiempo de espera a nivel de cliente de 200 milisegundos. Selecciona el MongoClientSettings o la pestaña Connection
String para ver el código correspondiente.
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); MongoClient mongoClient = MongoClients.create(settings);
String uri = "<connection string>/?timeoutMS=200"; MongoClient mongoClient = MongoClients.create(uri);
Valores de tiempo de espera aceptados
La siguiente tabla describe el comportamiento de espera correspondiente a los valores aceptados para timeoutMS:
Valor | Comportamiento |
|---|---|
Número entero positivo | Establece el tiempo de espera a utilizar para la finalización de la operación. |
| Especifica que las operaciones nunca se agotan. |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS. |
Si se especifica la opción timeoutMS, el driver aplica automáticamente el timeout especificado a cada operación del servidor. El siguiente ejemplo de código especifica un tiempo de espera de 200 milisegundos a nivel de cliente y luego llama al método MongoCollection.insertOne():
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("db"); MongoCollection<Document> collection = database.getCollection("people"); collection.insertOne(new Document("name", "Francine Loews")); }
Herencia de tiempo de espera
Cuando se especifica la opción timeoutMS, el controlador aplica el tiempo de espera de acuerdo con los mismos comportamientos de herencia que las demás opciones del controlador Java Reactive Streams. La siguiente tabla describe cómo se hereda el valor del tiempo de espera en cada nivel:
Nivel | Descripción de herencia |
|---|---|
Operación | Tiene la máxima prioridad y anula las opciones de tiempo de espera que estableciste en cualquier otro nivel. |
transacción | Tiene prioridad sobre el valor de tiempo de espera que fija en la sesión, colección, base de datos o nivel de cliente. |
sesión | Se aplica a todas las transacciones y operaciones dentro de esa sesión, a menos que establezca un valor de tiempo de espera diferente a esos niveles. |
Database | Se aplica a todas las sesiones y operaciones dentro de esa base de datos, a menos que establezcas un valor de tiempo de espera diferente en esos niveles. |
Colección | Se aplica a todas las sesiones y operaciones sobre esa colección, a menos que establezcas un valor de tiempo de espera diferente en esos niveles. |
Cliente | Se aplica a todas las bases de datos, recopilaciones, sesiones, transacciones y operaciones dentro de ese cliente que no especifiquen de otra manera |
Para obtener más información sobre las anulaciones y las opciones específicas, consulta la siguiente sección de Anulaciones.
Anulaciones
El controlador Java Reactive Streams admite diversos niveles de configuración para controlar el comportamiento y el rendimiento de las operaciones de base de datos.
Puedes especificar una opción timeoutMS a un nivel más específico para anular la configuración a nivel de cliente. La tabla en la sección anterior describe los niveles en los que se puede especificar una configuración de tiempo de espera (timeout). Esto permite personalizar los tiempos de espera según las necesidades de las operaciones individuales.
El siguiente ejemplo demuestra cómo una configuración de tiempo de espera a nivel de colección puede reemplazar una configuración de tiempo de espera a nivel de cliente:
MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("db"); MongoCollection<Document> collection = database .getCollection("people") .withTimeout(300L, MILLISECONDS); // ... perform operations on MongoCollection }
Transacciones
Al crear una nueva instancia de ClientSession para implementar una transacción, utiliza el método defaultTimeout() al construir una instancia de ClientSessionOptions. Puedes usar esta opción para especificar el tiempo de espera para los siguientes métodos:
El siguiente código muestra cómo configurar el defaultTimeout al crear una instancia de un ClientSession:
ClientSessionOptions opts = ClientSessionOptions.builder() .defaultTimeout(200L, MILLISECONDS) .build(); Publisher<ClientSession> session = mongoClient.startSession(opts); // ... perform operations on ClientSession
Si no se especifica el defaultTimeout, el controlador utiliza el valor de tiempo de espera establecido en el MongoClient principal.
También puedes establecer un tiempo de espera a nivel de transacción llamando al método timeout() al crear una instancia de TransactionOptions. La configuración de esta opción aplica un tiempo de espera a todas las operaciones realizadas en el ámbito de la transacción:
TransactionOptions transactionOptions = TransactionOptions.builder() .timeout(200L, MILLISECONDS) .build();
Para obtener más información sobre las transacciones, consulte Transactions guide.
Cifrado del cliente
Cuando usas la Encriptación de Campo a Nivel de Cliente (CSFLE), el driver utiliza la opción timeoutMS para limitar el tiempo permitido para las operaciones de encriptación y desencriptación. Puedes configurar una opción de tiempo de espera para tu instancia de ClientEncryption llamando al método timeout() al crear una instancia de ClientEncryptionSettings.
Si especificas el tiempo de espera cuando construyes una instancia de ClientEncryption, el tiempo de espera controla la duración de todas las operaciones realizadas en esa instancia. Si no se proporciona un tiempo de espera al instanciar ClientEncryption, la instancia hereda la configuración de tiempo de espera de MongoClient utilizado en el constructor ClientEncryption.
Si se establece timeoutMS tanto en el cliente como directamente en ClientEncryption, se le da prioridad al valor que se proporciona a ClientEncryption.
Cursors
Los cursores ofrecen configuraciones de tiempo de espera configurables cuando se utiliza la funcionalidad CSOT. Puede ajustar el manejo del cursor configurando tanto la duración del cursor como el modo de iteración del cursor. Para configurar el modo de tiempo de espera, utiliza el método timeoutMode() al ejecutar cualquier operación que devuelva resultados que hereden de la interfaz Publisher.
Para las operaciones que crean cursores, la configuración del tiempo de espera puede limitar la vida útil del cursor o aplicarse por separado a la operación original y a todas las llamadas subsecuentes.
Nota
Tiempo de espera heredado
Configurar un modo de tiempo de espera de cursor requiere que establezcas un tiempo de espera ya sea en el MongoClientSettings, en MongoDatabase o en MongoCollection.
Para obtener más información sobre los cursores, consulte la Guía de acceso a datos desde un cursor.
Modo de tiempo de vida del cursor
El modo de tiempo de vida del cursor utiliza la configuración de tiempo de espera para limitar toda la vida útil de un cursor. En este modo, tu aplicación debe inicializar el cursor, completar todas las llamadas a los métodos del cursor y devolver todos los documentos dentro del límite de tiempo especificado. De lo contrario, el tiempo de vida del cursor expira y el driver genera un error de tiempo de espera.
Cuando cierras un cursor llamando al método close(), el tiempo de espera se restablece para el comando killCursors para asegurar que los recursos del servidor se limpien.
El siguiente ejemplo muestra cómo configurar un tiempo de espera del cursor para asegurar que el cursor esté inicializado y que todos los documentos se recuperen dentro del tiempo de espera heredado:
FindPublisher<Document> findPublisherWithLifetimeTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.CURSOR_LIFETIME);
GridFS
Puedes establecer una opción de tiempo de espera para las operaciones de GridFS al instanciar un GridFSBucket utilizando el método withTimeout(). Este tiempo de espera se aplica a todas las operaciones realizadas en el bucket, como la carga y descarga de datos. Si no estableces un tiempo de espera, la instancia GridFSBucket hereda la configuración de tiempo de espera del MongoDatabase con la que se crea.
El siguiente código demuestra cómo establecer un tiempo de espera al instanciar un GridFSBucket:
GridFSBucket gridFSBucket = GridFSBuckets .create(database) .withTimeout(200L, MILLISECONDS);
Documentación de la API
Para obtener más información sobre el uso de "timeouts" con el controlador Java Reactive Streams (Flujos Reactivos Java), consulte la siguiente documentación de la API: