@ Вокруг аспекта и функция приостановки 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, Для полной ссылки смотрите здесь.

Другие вопросы по тегам