Kotlin 暂停功能方面

问题描述 投票:0回答:2

围绕 Kotlin 挂起函数创建切面的正确方法是什么?

根据我的观察,Micrometer 的 @Timed 方面确实可以与它们配合使用,但显示不正确的结果 - 看起来它测量的是方法调用和挂起之间的时间,而不是方法中花费的全部时间(应包括挂起后的时间)

我想要实现的目标的示例:

@CoroutineTimer
suspend fun dbCall() {
    repository.someQuery().awaitFirst() // suspension point
}

在本例中,我想知道花费在

dbCall
函数上的全部时间,并用自定义
@CoroutineTimer
注释进行标记。有办法吗?

kotlin aop aspectj kotlin-coroutines micrometer
2个回答
0
投票

您可以像这样测量执行时间:

suspend fun dbCall() {
    val (result, duration) = measureTimedValue {
        repository.someQuery().awaitFirst() // suspension point
    }
    println(duration)
    return result
}

0
投票

是的,你只需要使用KSP等代码生成工具即可。 这篇文章解释了如何使用它,因此您的注释处理器可以更改您的源代码:

@CoroutineTimer
suspend fun dbCall() {
    repository.someQuery().awaitFirst() // suspension point
}

对此:

suspend fun dbCall() {
    val (result, duration) = measureTimedValue {
        _dbCallMeasurable()
    }
    Log.d(duration)
    return result
}

suspend fun _dbCallMeasurable() {
    repository.someQuery().awaitFirst()
}
© www.soinside.com 2019 - 2024. All rights reserved.