Spring-Boot обрабатывает Kotlin сопрограмм вне контекста WebFlux? - PullRequest
0 голосов
/ 30 января 2020

Мы пытаемся использовать Kotlin сопрограммы для асинхронной обработки внутри бэкэнда Spring-Boot.

Проблема в том, что она, кажется, не поддерживает ее хорошо (по крайней мере, стандартная Spring MVC).

В основном, если у нас есть функция, которая выполняет асинхронную логику c:

fun fetchUsersAsync(): Deferred<Users> {
    return GlobalScope.async {
            ...
    }
} 

, и эта функция используется с await в какой-то момент службы, который требует поставить suspend аннотация в вызывающей сервисной функции:

@Service
class MyService {
    suspend fun processUsers(): Users {
        return fetchUsersAsync().await()
    }
}

К сожалению, это невозможно, и единственная ссылка для приостановки работы сервиса была связана с WebFlux.

Кто-нибудь сталкивался с такой же ситуацией? Спасибо.

1 Ответ

0 голосов
/ 31 января 2020

Если вы хотите вызвать await() без объявления функции suspend, оберните ее внутри компоновщика сопрограмм, например:

@Service
class MyService {
    fun processUsers(): Users {
        return runBlocking { fetchUsersAsync().await() }
    }
}
...