Reactive SQL 客户端 (Quarkus/Vert.X) 中的 Kotlin 协程事务

Posted

技术标签:

【中文标题】Reactive SQL 客户端 (Quarkus/Vert.X) 中的 Kotlin 协程事务【英文标题】:Kotlin Coroutine transaction in Reactive SQL Client (Quarkus/Vert.X) 【发布时间】:2022-01-12 14:45:57 【问题描述】:

我想在我的反应式 sql 客户端事务中使用 Kotlin 协程。 为简单起见,我将使用文档here 中提到的提供的辅助函数io.vertx.mutiny.sqlclient.Pool#withTransaction 。由于传递的函数不是协程挂起函数,所以当我尝试编译如下代码时,我会收到类似Suspension functions can be called only within coroutine body 的错误

val client : PgPool
... 

suspend fun someServiceFunction () 
    client.withTransaction  connection ->
        repository.save(connection, entity).awaitSuspending()   //This is not working
        ...
    

withTransaction 的函数头如下所示

@CheckReturnValue
public <T> Uni<T> withTransaction(Function<SqlConnection, Uni<T>> function)

我问自己是否还有办法将它与 kotlin 协程一起使用,因为我对它们很陌生。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我不熟悉 Mutiny 和 Quarkus,但似乎有一种方法可以将 mutiny-kotlin 中的 Deferred&lt;T&gt; 转换为 Uni&lt;T&gt;,您似乎正在使用它。

因此,您可以像这样创建自己的 withTransaction 暂停版本:

import io.vertx.mutiny.sqlclient.SqlConnection
import io.vertx.mutiny.sqlclient.Pool

@OptIn(ExperimentalCoroutinesApi::class)
suspend fun <T> Pool.withTransaction(block: suspend (SqlConnection) -> T): T = coroutineScope 
    client.withTransaction  connection ->
        async  block(connection) .asUni()
    .awaitSuspending()

然后使用它:

suspend fun someServiceFunction() 
    client.withTransaction  connection ->
        repository.save(connection, entity).awaitSuspending()
        // potentially other suspending stuff here, without the need to combine()
    

但这引出了一个问题,如果最终你想使用 Kotlin 协程,为什么要使用 Vertx 的 Mutiny 变体?我认为默认情况下 Vertx 可以与 Java 期货一起使用,这些期货也与协程集成。

【讨论】:

非常感谢!所以使用原始的 vertx 客户端听起来是可行的。虽然您对 Java futures which are also integrated with coroutines 到底是什么意思?它是否易于携带?希望看到一个例子 @AhmetKazaman 很抱歉,我对这个生态系统不是很了解,但看起来基于兵变的客户端已经在 vertx“纯”客户端之上进行了调整,这就是我的想法看起来我们在这里堆叠适配器层。但我猜没有什么重要的。

以上是关于Reactive SQL 客户端 (Quarkus/Vert.X) 中的 Kotlin 协程事务的主要内容,如果未能解决你的问题,请参考以下文章

是否有具有多个命名 Oidc 客户端的示例 quarkus 项目来调用多个服务调用?

Quarkus Rest客户端和OAuth2

Quarkus Mongodb 在本机构建中更改流 NullPointerException

quarkus: IllegalStateException: 你试图对一个IO线程进行阻塞操作。这是不允许的,因为阻塞IO线程

如何测试使用 apollo 客户端 Reactive Var 的组件

Web和Android中的Reactive