我想在我的反應式 sql 客戶端事務中使用 Kotlin 協程。為簡單起見,我將使用此處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 協程中使用它,因為我對它們很陌生。
感謝您的任何幫助 !
uj5u.com熱心網友回復:
我對 Mutiny 和 Quarkus 都不熟悉,但似乎有一種方法可以將 from 轉換Deferred<T>為Uni<T>in mutiny-kotlin,您似乎正在使用這種方法。
因此,您可以創建自己的暫停版本,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 期貨一起作業,這些期貨也與協程集成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/375954.html
