@ Вокруг аспекта и функция приостановки Kotlin
Я пытаюсь понять, как создать аспект @Around для приостановленной функции Kotlin (например, для измерения времени, потраченного на эту функцию, или для пользовательского аспекта @Transactional):
@Timed("my-timer")
suspend fun test() {
println("before")
delay(50) // invokes ProceedingJoinPoint#proceed() before this line
println("after")
}
Поскольку эта функция имеет вызов функции приостановки, функция продолжения аспекта @Around будет вызываться непосредственно перед вызовом delay(). Но, очевидно, я хотел бы измерить полное время, проведенное в функции.
Как правильно ее решить? Может быть, я могу как-то подписаться на последнее продолжение в методе, или что-то в этом роде?
1 ответ
Это отслеживается https://github.com/spring-projects/spring-framework/issues/22462 и, скорее всего, будет исправлено в версии 5.3.
Та же проблема возникает для @Transactional
.
Я думаю, что вы можете легко решить вашу проблему, если вы хотите измерить время выполнения функции, вы можете сделать это, используя встроенную функциональность, например:
val time = measureTimeMillis {
// yourSuperFunc()
}
Также вы можете использовать measureNanoTime
, Для полной ссылки смотрите здесь.