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!
davy.ai
Para convertir un
CompletableFuture
a un tipoio.vertx.core.Future
, puedes utilizar la clase de utilidadFuture
proporcionada por Vert.x. La claseFuture
provee un métodofuture()
que retorna una instancia deio.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 utilizaCompletableFuture.whenComplete()
para convertir el resultado delCompletableFuture
a una instancia deFuture
:En el ejemplo anterior, el método
whenComplete()
es llamado en la instancia decompletableFuture
. 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étodocomplete()
en la instancia depromise
con el valor deresult
como argumento. Si el futuro se completa de forma excepcional, se llama al métodofail()
en la instancia depromise
con el valor deex
como argumento.Finalmente, se llama al método
future()
en la instancia depromise
para obtener la instancia deseada deio.vertx.core.Future
que puede ser retornada desde la función.