当前位置: 首页 > 知识库问答 >
问题:

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

娄森
2023-03-14

我想在我的反应式sql客户端事务中使用Kotlin协程。为了简单起见,我打算使用提供的助手函数<code>io.vertx.mutiny.sqlclient。此处文档中提到的池#withTransaction。由于传递的函数不是协程挂起函数,因此当我试图编译以下代码时,我得到了一个类似<code>的错误:挂起函数只能在协程体中调用

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个答案

司徒炎彬
2023-03-14

我不熟悉Mutiny和Quarkus,但似乎有一种方法可以从<code>延迟转换

因此,您可以创建自己的 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变体呢?我认为默认情况下,Vertex与Java futures一起工作,后者也与协程集成。

 类似资料:
  • 我想使用Quarkus中的JooqDSL来构建我的SQL(并希望执行它们) 因此,我添加了以下Quarkus JOOQ扩展。 因为我想在我的项目中使用反应式PG SQL客户端,所以我问自己,例如JOOQ的< code>fetch()方法是否会阻塞线程?它是与引擎盖下的反应式vertx客户端兼容还是使用阻塞式客户端?看起来像后者,因为它不返回未来或者类似的东西。 在这种情况下,我应该只使用JOOQ来

  • 在一节中,引入了接口,允许在请求中注入头,但必须返回同步响应。我们不能使用,这正是我的情况所需要的,因为我需要在头中添加一个令牌,而这个令牌是由返回的另一个restendpoint的请求检索的。 我如何在新的实现中实现这一点?如果不可能,有没有解决办法?

  • 我使用的是客户端。客户端有一个<code>rxWrite<code>函数,它返回<code>Single 我已经编写了以下工作示例。 test():测试链接和日志记录的函数 writeKafka:将给定的字符串写入Kafka并返回Single writeError:始终返回具有相同类型错误的单个 所以当我调用< code>writeKafka时,它只打印< code>Error2,但是如果我使用<

  • 下列协程客户端是Swoole内置的类,其中 ⚠️ 标志的不要再使用,使用PHP原生的函数+一键协程化。 协程TCP/UDP客户端 协程HTTP客户端 协程HTTP2客户端 协程PostgreSQL客户端 协程Socket客户端 ⚠️ 协程Redis客户端 ⚠️ 协程MySql客户端 ⚠️ 协程System(Coroutine\System),主要是文件操作相关的不推荐使用。 超时规则 所有的网络请

  • 我尝试为我的后期服务添加一个示例,这是一个使用quarkus构建的简单rest API。 java版本运行良好。 当我添加另一个 Kotlin 来测试 Quarkus 中的 Kotlin 和 Gradle 支持时,它失败了,REST 客户端接口无法注入为 CDI bean。 是Jaxrs资源,用于公开将原始两个API组合在一起的聚合API。 以上两种注入Bean的方法都失败了。 REST客户端接口

  • !> 本客户端不再推荐使用,推荐使用Swoole\Runtime::enableCoroutine + phpredis 或 predis 的 方式,即一键协程化原生PHP的redis客户端使用. 使用示例 Co\run(function () { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1',