0

我正在尝试在协程中使用 vertx 反应式 sql 客户端执行数据库事务。不知何故,我无法弄清楚如何将其转换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 ?
        }
    }
}

感谢您的帮助 !

4

2 回答 2

3

Vert.x Future 有一个转换方法:

future = Future.fromCompletionStage(completionStage, vertxContext)
于 2021-12-07T21:21:32.853 回答
0

我从代码中对此进行了改编,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借用它的线程池。

于 2021-12-07T20:14:33.990 回答