如何将 CompletableFuture 转换为 Vert.X Future

Posted

技术标签:

【中文标题】如何将 CompletableFuture 转换为 Vert.X Future【英文标题】:How to convert a CompletableFuture to a Vert.X Future 【发布时间】:2022-01-12 20:46:15 【问题描述】:

我正在尝试在协程中使用 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 ?
        
    

感谢您的帮助!

【问题讨论】:

【参考方案1】:

Vert.x Future 有转换方法:

future = Future.fromCompletionStage(completionStage, vertxContext)

【讨论】:

这就是我要寻找的!非常感谢您【参考方案2】:

我从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 借用它的线程池。

【讨论】:

Vertx 提供了一个调度器:vertx.io/docs/vertx-lang-kotlin-coroutines/kotlin/… 那会是什么样子? @AhmetKazaman 我用过很多 Vert.x,但我没有用过 Kotlin,所以我不知道答案。我猜想我链接到的页面上的文档将为更熟悉 Kotlin 的人提供足够的指导来找出答案(我怀疑你根本不需要 CompletableFuture 来做 OP 是尝试做),但我真的不确定! 是的,我认为您只需要在某些情况下使用上述功能。如果您在项目中使用协程而不使用遗留代码或需要使用 Future 的 API,则直接传递 Kotlin Deferred 或简单地使用挂起函数会更自然。在使用协程处理 Vert.x 时,我会使用链接的调度程序 @dano。

以上是关于如何将 CompletableFuture 转换为 Vert.X Future的主要内容,如果未能解决你的问题,请参考以下文章

将 CompletableFuture<Stream<T>> 转换为 Publisher<T> 是不是正确?

如何将异步CompletableFuture与完成的CompletableFuture结合起来?

thenApply()和thenCompose()的区别

如何完成 CompletableFuture<Void>?

Day843.CompletableFuture -Java 并发编程实战

Day843.CompletableFuture -Java 并发编程实战