Reactive SQL Client (Quarkus/Vert.X) 中的 Kotlin Coroutine 事务
Kotlin Coroutine transaction in Reactive SQL Client (Quarkus/Vert.X)
我想在我的反应式 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 协程一起使用,因为我对它们还很陌生。
感谢您的帮助!
我不熟悉 Mutiny 和 Quarkus,但似乎有一种方法可以将 Deferred<T>
转换为 mutiny-kotlin
中的 Uni<T>
,您似乎正在使用它。
因此,您可以创建自己的 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 期货一起工作,后者也与协程集成。
我想在我的反应式 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 协程一起使用,因为我对它们还很陌生。
感谢您的帮助!
我不熟悉 Mutiny 和 Quarkus,但似乎有一种方法可以将 Deferred<T>
转换为 mutiny-kotlin
中的 Uni<T>
,您似乎正在使用它。
因此,您可以创建自己的 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 期货一起工作,后者也与协程集成。