我正试图在协同程序中使用vertx反应式sql客户端执行一个db事务。不知怎的,我不知道如何将CompletableFuture
转换为所需的io.vertx.core.Future
类型。有没有任何帮助方法或扩展可以轻松做到这一点?
val client : PgPool
...
suspend fun someServiceFunction () {
coroutineScope {
client.withTransaction { connection ->
val completableFuture = async {
repository.save(connection, requestDTO) //This is a suspend function
}.asCompletableFuture()
//Return type has to be a io.vertx.core.Future
//How can I transform the completableFuture to it ?
}
}
}
谢谢你的帮助!
Vert.x Future有一种转换方法:
future = Future.fromCompletionStage(completionStage, vertxContext)
我从asCompletableFuture()
的代码中修改了这一点,以用作替代方案。免责声明:我没有使用Vert.x,我也没有测试这个。
fun <T> Deferred<T>.asVertxFuture(): Future<T> {
val promise = Promise.promise<T>()
invokeOnCompletion {
try {
promise.complete(getCompleted())
} catch (t: Throwable) {
promise.fail(t)
}
}
return promise.future()
.onComplete { result ->
cancel(result.cause()?.let {
it as? CancellationException ?: CancellationException("Future was completed exceptionally", it)
})
}
}
我想知道将协同程序与Vert.x混合是否会因为没有使用Vert.x线程池而影响性能。也许您可以创建一个借用其线程池的Dispatchers.Vertx
。