es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir un CompletableFuture en un Futuro de Vert.X

Estoy intentando ejecutar una transacción de base de datos con el cliente SQL reactivo de Vertx en una coroutine.
De alguna manera no puedo entender cómo puedo convertir el CompletableFuture al tipo deseado io.vertx.core.Future. ¿Hay algún método auxiliar o extensiones para hacer esto fácilmente?

val client: PgPool
...

suspend fun someServiceFunction() {
    coroutineScope {
        client.withTransaction { connection ->
            val completableFuture = async {
                repository.save(connection, requestDTO)  //Esta es una función suspendida
            }.asCompletableFuture()

            //El tipo de retorno tiene que ser un io.vertx.core.Future
            //¿Cómo puedo transformar el completableFuture en eso?
        }
    }
}

¡Gracias por tu ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir un CompletableFuture a un tipo io.vertx.core.Future, puedes utilizar la clase de utilidad Future proporcionada por Vert.x. La clase Future provee un método future() que retorna una instancia de io.vertx.core.Future que puede ser utilizada para representar el resultado de una operación asíncrona.

    Puedes utilizar el método Future.promise() para crear un objeto promise, luego utiliza CompletableFuture.whenComplete() para convertir el resultado del CompletableFuture a una instancia de Future:

    import io.vertx.kotlin.core.future.promise
    
    suspend fun someServiceFunction() {
      coroutineScope {
        client.withTransaction { connection ->
          val completableFuture = async {
            repository.save(connection, requestDTO)
          }.asCompletableFuture()
    
          val promise = promise<sometype>() //reemplaza SomeType con el tipo real que necesitas retornar
    
          completableFuture.whenComplete { result, ex ->
            if (ex != null) {
              promise.fail(ex)
            } else {
              promise.complete(result)
            }
          }
    
          promise.future()
        }
      }
    }
    

    En el ejemplo anterior, el método whenComplete() es llamado en la instancia de completableFuture. Recibe una función callback que es llamada cuando el futuro se completa de forma normal o excepcional. Si el futuro se completa de forma normal, se llama al método complete() en la instancia de promise con el valor de result como argumento. Si el futuro se completa de forma excepcional, se llama al método fail() en la instancia de promise con el valor de ex como argumento.

    Finalmente, se llama al método future() en la instancia de promise para obtener la instancia deseada de io.vertx.core.Future que puede ser retornada desde la función.

Comments are closed.